1 /* CANNA interface -*- coding: euc-jp -*-
3 Copyright (C) 1995 Free Software Foundation, Inc.
4 Copyright (C) 1995 Sun Microsystems, Inc.
6 This file is part of SXEmacs
8 SXEmacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 SXEmacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 /* Synched up with: Mule 2.3. Not in FSF. */
24 /* Japanese comments were translated 2000-12-06 by Stephen Turnbull
25 <stephen@xemacs.org>. I haven't verified that the Japanese comments
26 were correct. YMMV, NO WARRANTY, not even the implied warranty of
27 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. (^^;;; as the
32 Authors: Akira Kon (kon@uxd.fc.nec.co.jp)
33 Ichiro Hirakura (hirakura@uxd.fc.nec.co.jp)
35 Functions defined in this file are
40 Length of converted string if no error occurs.
41 Error string if error occurs.
43 Convert a key input to a set of strings. The
44 strings contain both well-formed string and a
45 intermediate result to show the translation
46 information to a user. converted strings are
47 stored in specific variables.
51 List of the following things:
52 - list of keys to toggle Japanese-mode
54 - list of warning messages
56 Initialize ``canna'', which is a kana-to-kanji
57 converter for GNU Emacs. The first arg
58 specifies if inserting space character between
59 BUNSETSU when candidates are displayed. The
60 second arg specifies server. The third arg
61 specifies a file which will be used as a
62 customization description. If nil is
63 specified for each arg, the default value will
68 list of warning messages
70 finalize ``canna'', which is a kana-to-kanji
71 converter for GNU Emacs. This cause to write
72 miscellaneous informations to kana-to-kanji
75 (canna-touroku-string string)
77 String to register to a dictionary.
79 The same thing returns as canna-key-proc does.
81 Register Kanji words into kana-to-kanji
82 conversion dictionary.
84 (canna-set-width width)
86 Column width of the place where the candidates
87 of kana-to-kanji conversion will be shown.
91 Set status-line width information, which is
92 used to display kanji candidates.
94 (canna-change-mode num)
96 The mode number of Canna.
98 The same thing returns as canna-key-proc does.
100 Change Japanese pre-edit mode.
102 (canna-store-yomi yomi roma)
104 ``Yomi'' to be stored.
106 ``Romaji'' which corresponds to the ``Yomi''.
108 The same thing returns as canna-key-proc does.
110 Store yomi characters as a YOMI of
111 kana-to-kanji conversion.
113 (canna-do-function num ch)
115 A function number to be called.
117 A character will be specified in order to feed
118 the character to the function if the function
119 needs a input character.
121 The same thing returns as canna-key-proc does.
123 Do specified function at current mode.
129 List of warning messages.
131 Parse customize string.
135 A string which indicate the current mode.
137 Get current mode string.
139 Functions below are used for KKCP compatible library. These
140 functions provides a base kana-to-kanji conversion system for EGG.
141 These functions may be used when users want to change the engine
142 from Wnn to Canna without changing user interface of Japanese input.
146 (canna-bunsetu-henkou)
147 (canna-henkan-kakutei)
157 #include "file-coding.h"
161 #include "canna/jrkanji.h"
162 #include "canna/RK.h"
164 #include "iroha/jrkanji.h"
165 #include "iroha/RK.h"
167 extern char *jrKanjiError;
169 /* #### is this global really necessary? */
170 #define KEYTOSTRSIZE 2048
171 static unsigned char key_buffer[KEYTOSTRSIZE];
172 static char **warning;
174 static int canna_empty_info, canna_through_info;
175 static int canna_underline;
176 static int canna_inhibit_hankakukana;
178 static Lisp_Object Vcanna_kakutei_string;
179 static Lisp_Object Vcanna_kakutei_yomi;
180 static Lisp_Object Vcanna_kakutei_romaji;
181 static Lisp_Object Vcanna_henkan_string;
182 static Fixnum canna_henkan_length;
183 static Fixnum canna_henkan_revPos;
184 static Fixnum canna_henkan_revLen;
185 static Lisp_Object Vcanna_ichiran_string;
186 static Fixnum canna_ichiran_length;
187 static Fixnum canna_ichiran_revPos;
188 static Fixnum canna_ichiran_revLen;
189 static Lisp_Object Vcanna_mode_string;
191 static int IRCP_context;
193 static Lisp_Object storeResults(unsigned char *, int, jrKanjiStatus *);
194 static Lisp_Object kanjiYomiList(int, int);
195 static Lisp_Object CANNA_mode_keys(void);
198 static void m2c(unsigned char *, int, unsigned char *);
199 static Lisp_Object mule_make_string(unsigned char *, int);
200 static int mule_strlen(unsigned char *, int);
201 static void count_char(unsigned char *, int, int, int, Fixnum *, Fixnum *,
203 #define make_string mule_make_string
206 /* Lisp functions definition */
208 DEFUN("canna-key-proc", Fcanna_key_proc, 1, 1, 0, /*
209 Translate a key input to a set of strings. The strings contain both
210 well-formed string and intermediate result to show the translation
211 information to a user. Converted strings are stored in specific
219 CHECK_CHAR_COERCE_INT(ch);
220 len = jrKanjiString(0, XCHAR(ch), key_buffer, KEYTOSTRSIZE, &ks);
221 return storeResults(key_buffer, len, &ks);
224 static Lisp_Object storeResults(unsigned char *buf, int len, jrKanjiStatus * ks)
226 Lisp_Object val = Qnil;
228 if (len < 0) { /* Error detected */
230 make_string((unsigned char *)jrKanjiError,
231 strlen(jrKanjiError));
233 /* ³ÎÄꤷ¤¿Ê¸»úÎó (the confirmed string) */
234 Vcanna_kakutei_string = make_string(buf, len);
236 /* ³ÎÄꤷ¤¿Ê¸»úÎó¤ÎÆɤߤξðÊó...
237 (info about the reading of the confirmed string) */
238 Vcanna_kakutei_yomi = Vcanna_kakutei_romaji = Qnil;
239 if (ks->info & KanjiYomiInfo) {
240 unsigned char *p = buf + len + 1;
241 int yomilen = strlen(p);
243 if (len + yomilen + 1 < KEYTOSTRSIZE) {
246 Vcanna_kakutei_yomi = make_string(p, yomilen); /* Æɤß
249 yomilen2 = strlen(p);
250 if (len + yomilen + yomilen2 + 2 < KEYTOSTRSIZE) {
251 Vcanna_kakutei_romaji =
252 make_string(p, yomilen2);
253 /* ¥í¡¼¥Þ»ú (romanization) */
258 /* ¸õÊäɽ¼¨¤Îʸ»úÎó¤Ç¤¹¡£
259 (string for displaying candidate translations) */
260 Vcanna_henkan_string = Qnil;
261 if (ks->length >= 0) {
262 Vcanna_henkan_string =
263 make_string(ks->echoStr, ks->length);
265 canna_henkan_length = ks->length;
266 canna_henkan_revPos = ks->revPos;
267 canna_henkan_revLen = ks->revLen;
268 #else /* CANNA_MULE */
269 if (canna_underline) {
270 canna_henkan_length =
271 mule_strlen(ks->echoStr, ks->length);
272 canna_henkan_revPos =
273 mule_strlen(ks->echoStr, ks->revPos);
274 canna_henkan_revLen =
275 mule_strlen(ks->echoStr + ks->revPos,
278 count_char(ks->echoStr, ks->length, ks->revPos,
279 ks->revLen, &canna_henkan_length,
280 &canna_henkan_revPos,
281 &canna_henkan_revLen);
283 #endif /* CANNA_MULE */
286 /* °ìÍ÷¤Î¾ðÊó (information about the echo area menu) */
287 Vcanna_ichiran_string = Qnil;
288 if (ks->info & KanjiGLineInfo && ks->gline.length >= 0) {
289 Vcanna_ichiran_string = make_string(ks->gline.line,
292 canna_ichiran_length = ks->gline.length;
293 canna_ichiran_revPos = ks->gline.revPos;
294 canna_ichiran_revLen = ks->gline.revLen;
295 #else /* CANNA_MULE */
296 count_char(ks->gline.line, ks->gline.length,
297 ks->gline.revPos, ks->gline.revLen,
298 &canna_ichiran_length,
299 &canna_ichiran_revPos,
300 &canna_ichiran_revLen);
301 #endif /* CANNA_MULE */
304 /* ¥â¡¼¥É¤Î¾ðÊó (mode information) */
305 Vcanna_mode_string = Qnil;
306 if (ks->info & KanjiModeInfo) {
308 make_string(ks->mode, strlen(ks->mode));
311 /* ¤½¤Î¾¤Î¾ðÊó (other information) */
312 canna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
313 canna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0;
319 DEFUN("canna-set-bunsetsu-kugiri", Fcanna_set_bunsetsu, 0, 1, 0, /*
320 This function sets the clause separator.
321 If non-nil value is specified, the white space separator will be used.
322 No separator will be used otherwise.
326 int kugiri; /* ʸÀá¶èÀÚ¤ê¤ò¤¹¤ë¤«¡© (display clause separator?) */
328 kugiri = NILP(num) ? 0 : 1;
330 jrKanjiControl(0, KC_SETBUNSETSUKUGIRI, (char *)kugiri);
335 /* For whatever reason, calling Fding directly from libCanna loses */
336 static void call_Fding(void)
338 Fding(Qnil, Qnil, Qnil);
341 DEFUN("canna-initialize", Fcanna_initialize, 0, 3, 0, /*
342 Initialize ``canna'', which is a kana-to-kanji converter for GNU Emacs.
343 The first arg specifies if inserting space character between BUNSETSU when
344 candidates are displayed.
345 The second arg specifies server.
346 The third arg specifies a file which will be used as a customization
348 If nil is specified for each arg, the default value will be used.
350 (num, server, rcfile))
354 unsigned char **p, **q;
356 int kugiri; /* ʸÀá¶èÀÚ¤ê¤ò¤¹¤ë¤«¡© (display clause separator?) */
365 kugiri = (kugiri == 1) ? 1 : 0;
369 jrKanjiControl(0, KC_SETSERVERNAME, (char *)0);
371 char servername[256];
373 CHECK_STRING(server);
374 strncpy(servername, XSTRING_DATA(server),
375 XSTRING_LENGTH(server));
376 servername[XSTRING_LENGTH(server)] = '\0';
377 jrKanjiControl(0, KC_SETSERVERNAME, servername);
381 jrKanjiControl(0, KC_SETINITFILENAME, (char *)0);
385 CHECK_STRING(rcfile);
386 strncpy(rcname, XSTRING_DATA(rcfile), XSTRING_LENGTH(rcfile));
387 rcname[XSTRING_LENGTH(rcfile)] = '\0';
388 jrKanjiControl(0, KC_SETINITFILENAME, rcname);
391 warning = (char **)0;
394 #endif /* nec_ews_svr4 */
395 res = jrKanjiControl(0, KC_INITIALIZE, (char *)&warning);
398 #endif /* nec_ews_svr4 */
401 for (p = q = (unsigned char **)warning; *q; q++) ;
404 val = Fcons(make_string(*q, strlen(*q)), val);
407 val = Fcons(val, Qnil);
410 val = Fcons(make_string((unsigned char *)jrKanjiError,
411 strlen(jrKanjiError)), val);
412 /* ¥¤¥Ë¥·¥ã¥é¥¤¥º¤Ç¼ºÇÔ¤·¤¿¾ì¹ç¡£ (on initialization failure) */
413 return Fcons(Qnil, val);
415 extern void (*jrBeepFunc) (void);
417 jrBeepFunc = call_Fding;
421 wcKanjiControl(0, KC_SETAPPNAME, "nemacs");
422 #else /* CANNA_MULE */
423 wcKanjiControl(0, KC_SETAPPNAME, "mule");
424 #endif /* CANNA_MULE */
425 #endif /* KC_SETAPPNAME */
427 jrKanjiControl(0, KC_SETBUNSETSUKUGIRI, (char *)kugiri);
428 jrKanjiControl(0, KC_SETWIDTH, (char *)78);
430 jrKanjiControl(0, KC_INHIBITHANKAKUKANA, (char *)1);
432 /* mule ¤À¤Ã¤¿¤éȾ³Ñ¥«¥¿¥«¥Ê¤â»È¤¨¤ë
433 (Mule can use half-width katakana) */
434 if (canna_inhibit_hankakukana)
435 jrKanjiControl(0, KC_INHIBITHANKAKUKANA, (char *)1);
437 jrKanjiControl(0, KC_YOMIINFO, (char *)2); /* ¢¨£²: ¥í¡¼¥Þ»ú¤Þ¤ÇÊÖ¤¹
440 val = Fcons(Qnil, val);
441 return Fcons(CANNA_mode_keys(), val);
445 DEFUN("canna-finalize", Fcanna_finalize, 0, 0, 0, /*
446 finalize ``canna'', which is a kana-to-kanji converter for GNU Emacs.
447 This cause to write miscellaneous informations to kana-to-kanji dictionary.
454 jrKanjiControl(0, KC_FINALIZE, (char *)&warning);
458 for (p = (unsigned char **)warning; *p; p++) {
459 val = Fcons(make_string(*p, strlen(*p)), val);
462 val = Fcons(val, Qnil);
467 DEFUN("canna-touroku-string", Fcanna_touroku_string, 1, 1, 0, /*
468 Register Kanji words into kana-to-kanji conversion dictionary.
472 jrKanjiStatusWithValue ksv;
477 unsigned char cbuf[4096];
481 ksv.buffer = (unsigned char *)key_buffer;
482 ksv.bytes_buffer = KEYTOSTRSIZE;
484 ks.echoStr = XSTRING_DATA(str);
485 ks.length = XSTRING_LENGTH(str);
486 #else /* CANNA_MULE */
487 m2c(XSTRING_DATA(str), XSTRING_LENGTH(str), cbuf);
489 ks.length = strlen(cbuf);
490 #endif /* CANNA_MULE */
492 len = jrKanjiControl(0, KC_DEFINEKANJI, (char *)&ksv);
493 val = storeResults(key_buffer, ksv.val, ksv.ks);
497 DEFUN("canna-set-width", Fcanna_set_width, 1, 1, 0, /*
498 Set status-line width information, which is used to display
505 jrKanjiControl(0, KC_SETWIDTH, (char *)XINT(num));
509 DEFUN("canna-change-mode", Fcanna_change_mode, 1, 1, 0, /*
510 Change Japanese pre-edit mode.
514 jrKanjiStatusWithValue ksv;
520 ksv.buffer = (unsigned char *)key_buffer;
521 ksv.bytes_buffer = KEYTOSTRSIZE;
524 jrKanjiControl(0, KC_CHANGEMODE, (char *)&ksv);
525 val = storeResults(key_buffer, ksv.val, ksv.ks);
529 static Lisp_Object CANNA_mode_keys(void)
531 #define CANNAWORKBUFSIZE 32
532 char xxx[CANNAWORKBUFSIZE];
536 n = jrKanjiControl(0, KC_MODEKEYS, xxx);
538 for (i = n; i > 0;) {
540 /* !!#### something fucked here */
542 Fcons(make_char((int)(0xFF & (unsigned char)xxx[i])), val);
547 DEFUN("canna-store-yomi", Fcanna_store_yomi, 1, 2, 0, /*
548 Store yomi characters as a YOMI of kana-to-kanji conversion.
552 jrKanjiStatusWithValue ksv;
557 strncpy(key_buffer, XSTRING_DATA(yomi), XSTRING_LENGTH(yomi));
558 ks.length = XSTRING_LENGTH(yomi);
559 key_buffer[ks.length] = '\0';
560 #else /* CANNA_MULE */
561 m2c(XSTRING_DATA(yomi), XSTRING_LENGTH(yomi), key_buffer);
562 ks.length = strlen(key_buffer);
563 #endif /* CANNA_MULE */
571 strncpy(key_buffer + XSTRING_LENGTH(yomi) + 1,
572 XSTRING_DATA(roma), XSTRING_LENGTH(roma));
573 key_buffer[XSTRING_LENGTH(yomi) + 1 + XSTRING_LENGTH(roma)] =
576 (unsigned char *)(key_buffer + XSTRING_LENGTH(yomi) + 1);
577 #else /* CANNA_MULE */
578 ks.mode = (unsigned char *)(key_buffer + ks.length + 1);
579 m2c(XSTRING_DATA(roma), XSTRING_LENGTH(roma), ks.mode);
580 #endif /* CANNA_MULE */
583 ks.echoStr = (unsigned char *)key_buffer;
584 ksv.buffer = (unsigned char *)key_buffer; /* ÊÖÃÍÍÑ (return value) */
585 ksv.bytes_buffer = KEYTOSTRSIZE;
588 jrKanjiControl(0, KC_STOREYOMI, (char *)&ksv);
590 return storeResults(key_buffer, ksv.val, ksv.ks);
593 DEFUN("canna-do-function", Fcanna_do_function, 1, 2, 0, /*
594 Do specified function at current mode.
598 jrKanjiStatusWithValue ksv;
608 *key_buffer = XCHAR(ch);
611 ksv.buffer = (unsigned char *)key_buffer;
612 ksv.bytes_buffer = KEYTOSTRSIZE;
615 jrKanjiControl(0, KC_DO, (char *)&ksv);
616 val = storeResults(key_buffer, ksv.val, ksv.ks);
620 DEFUN("canna-parse", Fcanna_parse, 1, 1, 0, /*
621 Parse customize string.
632 strncpy(key_buffer, XSTRING_DATA(str), XSTRING_LENGTH(str));
633 key_buffer[XSTRING_LENGTH(str)] = '\0';
634 #else /* CANNA_MULE */
635 m2c(XSTRING_DATA(str), XSTRING_LENGTH(str), key_buffer);
636 #endif /* CANNA_MULE */
637 p = (unsigned char **)key_buffer;
638 n = jrKanjiControl(0, KC_PARSE, (char *)&p);
642 val = Fcons(make_string(p[n], strlen(p[n])), val);
647 DEFUN("canna-query-mode", Fcanna_query_mode, 0, 0, 0, /*
648 Get current mode string.
652 unsigned char buf[256];
654 jrKanjiControl(0, KC_QUERYMODE, buf);
655 return make_string(buf, strlen(buf));
659 * Functions following this line are for KKCP interface compatible
660 * library. These functions may be used by MILK system.
663 #define RKBUFSIZE 1024
665 static unsigned char yomibuf[RKBUFSIZE];
666 static short kugiri[RKBUFSIZE / 2];
668 static int confirmContext(void)
670 if (IRCP_context < 0) {
674 jrKanjiControl(0, KC_GETCONTEXT, (char *)0)) == -1) {
677 IRCP_context = context;
682 static int byteLen(int bun, int len)
684 int i = 0, offset = 0, ch;
686 if (0 <= bun && bun < RKBUFSIZE) {
687 offset = kugiri[bun];
690 while (len-- > 0 && (ch = (int)yomibuf[offset + i])) {
699 DEFUN("canna-henkan-begin", Fcanna_henkan_begin, 1, 1, 0, /*
700 Return the result of kana-to-kanji conversion.
701 Clause separator is set.
708 if (confirmContext() == 0) {
712 strncpy(yomibuf, XSTRING_DATA(yomi), XSTRING_LENGTH(yomi));
713 yomibuf[XSTRING_LENGTH(yomi)] = '\0';
714 nbun = RkBgnBun(IRCP_context, XSTRING_DATA(yomi), XSTRING_LENGTH(yomi),
715 (RK_XFER << RK_XFERBITS) | RK_KFER);
716 #else /* CANNA_MULE */
717 m2c(XSTRING_DATA(yomi), XSTRING_LENGTH(yomi), yomibuf);
718 nbun = RkBgnBun(IRCP_context, (char *)yomibuf, strlen(yomibuf),
719 (RK_XFER << RK_XFERBITS) | RK_KFER);
720 #endif /* CANNA_MULE */
722 return kanjiYomiList(IRCP_context, nbun);
725 static Lisp_Object kanjiYomiList(int context, int nbun)
727 Lisp_Object val, res = Qnil;
728 unsigned char RkBuf[RKBUFSIZE];
731 for (i = nbun; i > 0;) {
734 len = RkGetKanji(context, RkBuf, RKBUFSIZE);
735 val = make_string(RkBuf, len);
736 len = RkGetYomi(context, RkBuf, RKBUFSIZE);
737 res = Fcons(Fcons(val, make_string(RkBuf, len)), res);
738 if (i < RKBUFSIZE / 2) {
742 for (i = 0, total = 0; i < nbun; i++) {
743 int temp = kugiri[i];
750 DEFUN("canna-henkan-next", Fcanna_henkan_next, 1, 1, 0, /*
751 Return the list of candidates.
756 unsigned char *p, RkBuf[RKBUFSIZE];
757 Lisp_Object res = Qnil, endp;
760 if (confirmContext() == 0) {
763 RkGoTo(IRCP_context, XINT(bunsetsu));
764 len = RkGetKanjiList(IRCP_context, RkBuf, RKBUFSIZE);
766 for (i = 0; i < len; i++) {
769 endp = res = Fcons(make_string(p, slen), Qnil);
771 endp = XCDR(res) = Fcons(make_string(p, slen), Qnil);
778 DEFUN("canna-bunsetu-henkou", Fcanna_bunsetu_henkou, 2, 2, 0, /*
779 Specify the length of a clause.
788 nbun = XINT(bunsetsu);
789 if (confirmContext() == 0) {
792 RkGoTo(IRCP_context, nbun);
793 len = byteLen(nbun, XINT(bunlen));
794 return kanjiYomiList(IRCP_context, RkResize(IRCP_context, len));
797 DEFUN("canna-henkan-kakutei", Fcanna_henkan_kakutei, 2, 2, 0, /*
804 if (confirmContext() == 0) {
808 RkGoTo(IRCP_context, nbun);
810 nkouho = XINT(kouho);
811 RkXfer(IRCP_context, nkouho);
815 DEFUN("canna-henkan-end", Fcanna_henkan_end, 0, 0, 0, /*
820 if (confirmContext() == 0) {
823 RkEndBun(IRCP_context, 1); /* ³Ø½¬¤Ï¤¤¤Ä¤Ç¤â¹Ô¤Ã¤ÆÎɤ¤¤â¤Î¤Ê¤Î¤«¡©
824 (is it OK to invoke learning function
825 at arbitrary times?) */
829 DEFUN("canna-henkan-quit", Fcanna_henkan_quit, 0, 0, 0, /*
834 if (confirmContext() == 0) {
837 RkEndBun(IRCP_context, 0);
841 /* variables below this line is constants of Canna */
843 static Fixnum canna_mode_AlphaMode;
844 static Fixnum canna_mode_EmptyMode;
845 static Fixnum canna_mode_KigoMode;
846 static Fixnum canna_mode_YomiMode;
847 static Fixnum canna_mode_JishuMode;
848 static Fixnum canna_mode_TankouhoMode;
849 static Fixnum canna_mode_IchiranMode;
850 static Fixnum canna_mode_YesNoMode;
851 static Fixnum canna_mode_OnOffMode;
852 #ifdef CANNA_MODE_AdjustBunsetsuMode
853 static Fixnum canna_mode_AdjustBunsetsuMode;
855 #ifdef CANNA_MODE_ChikujiYomiMode
856 static Fixnum canna_mode_ChikujiYomiMode;
857 static Fixnum canna_mode_ChikujiTanMode;
860 static Fixnum canna_mode_HenkanMode;
861 #ifdef CANNA_MODE_HenkanNyuryokuMode
862 static Fixnum canna_mode_HenkanNyuryokuMode;
864 #ifdef CANNA_MODE_ZenHiraHenkanMode
865 static Fixnum canna_mode_ZenHiraHenkanMode;
866 #ifdef CANNA_MODE_HanHiraHenkanMode
867 static Fixnum canna_mode_HanHiraHenkanMode;
869 static Fixnum canna_mode_ZenKataHenkanMode;
870 static Fixnum canna_mode_HanKataHenkanMode;
871 static Fixnum canna_mode_ZenAlphaHenkanMode;
872 static Fixnum canna_mode_HanAlphaHenkanMode;
874 static Fixnum canna_mode_ZenHiraKakuteiMode;
875 #ifdef CANNA_MODE_HanHiraKakuteiMode
876 static Fixnum canna_mode_HanHiraKakuteiMode;
878 static Fixnum canna_mode_ZenKataKakuteiMode;
879 static Fixnum canna_mode_HanKataKakuteiMode;
880 static Fixnum canna_mode_ZenAlphaKakuteiMode;
881 static Fixnum canna_mode_HanAlphaKakuteiMode;
882 static Fixnum canna_mode_HexMode;
883 static Fixnum canna_mode_BushuMode;
884 static Fixnum canna_mode_ExtendMode;
885 static Fixnum canna_mode_RussianMode;
886 static Fixnum canna_mode_GreekMode;
887 static Fixnum canna_mode_LineMode;
888 static Fixnum canna_mode_ChangingServerMode;
889 static Fixnum canna_mode_HenkanMethodMode;
890 static Fixnum canna_mode_DeleteDicMode;
891 static Fixnum canna_mode_TourokuMode;
892 static Fixnum canna_mode_TourokuEmptyMode;
893 static Fixnum canna_mode_TourokuHinshiMode;
894 static Fixnum canna_mode_TourokuDicMode;
895 static Fixnum canna_mode_QuotedInsertMode;
896 static Fixnum canna_mode_BubunMuhenkanMode;
897 static Fixnum canna_mode_MountDicMode;
899 static Fixnum canna_fn_SelfInsert;
900 static Fixnum canna_fn_FunctionalInsert;
901 static Fixnum canna_fn_QuotedInsert;
902 static Fixnum canna_fn_JapaneseMode;
903 static Fixnum canna_fn_AlphaMode;
904 static Fixnum canna_fn_HenkanNyuryokuMode;
905 static Fixnum canna_fn_Forward;
906 static Fixnum canna_fn_Backward;
907 static Fixnum canna_fn_Next;
908 static Fixnum canna_fn_Prev;
909 static Fixnum canna_fn_BeginningOfLine;
910 static Fixnum canna_fn_EndOfLine;
911 static Fixnum canna_fn_DeleteNext;
912 static Fixnum canna_fn_DeletePrevious;
913 static Fixnum canna_fn_KillToEndOfLine;
914 static Fixnum canna_fn_Henkan;
915 static Fixnum canna_fn_Kakutei;
916 static Fixnum canna_fn_Extend;
917 static Fixnum canna_fn_Shrink;
918 #ifdef CANNA_FN_AdjustBunsetsu
919 static Fixnum canna_fn_AdjustBunsetsu;
921 static Fixnum canna_fn_Quit;
922 static Fixnum canna_fn_ConvertAsHex;
923 static Fixnum canna_fn_ConvertAsBushu;
924 static Fixnum canna_fn_KouhoIchiran;
925 static Fixnum canna_fn_BubunMuhenkan;
926 static Fixnum canna_fn_Zenkaku;
927 static Fixnum canna_fn_Hankaku;
928 static Fixnum canna_fn_ToUpper;
929 static Fixnum canna_fn_Capitalize;
930 static Fixnum canna_fn_ToLower;
931 static Fixnum canna_fn_Hiragana;
932 static Fixnum canna_fn_Katakana;
933 static Fixnum canna_fn_Romaji;
934 #ifdef CANNA_FN_BaseHiragana
935 static Fixnum canna_fn_BaseHiragana;
936 static Fixnum canna_fn_BaseKatakana;
937 static Fixnum canna_fn_BaseEisu;
938 static Fixnum canna_fn_BaseZenkaku;
939 static Fixnum canna_fn_BaseHankaku;
940 static Fixnum canna_fn_BaseKana;
941 static Fixnum canna_fn_BaseKakutei;
942 static Fixnum canna_fn_BaseHenkan;
943 static Fixnum canna_fn_BaseHiraKataToggle;
944 static Fixnum canna_fn_BaseZenHanToggle;
945 static Fixnum canna_fn_BaseKanaEisuToggle;
946 static Fixnum canna_fn_BaseKakuteiHenkanToggle;
947 static Fixnum canna_fn_BaseRotateForward;
948 static Fixnum canna_fn_BaseRotateBackward;
950 static Fixnum canna_fn_ExtendMode;
951 static Fixnum canna_fn_Touroku;
952 static Fixnum canna_fn_HexMode;
953 static Fixnum canna_fn_BushuMode;
954 static Fixnum canna_fn_KigouMode;
956 static Fixnum canna_fn_Mark;
958 #ifdef CANNA_FN_TemporalMode
959 static Fixnum canna_fn_TemporalMode;
962 static Fixnum canna_key_Nfer;
963 static Fixnum canna_key_Xfer;
964 static Fixnum canna_key_Up;
965 static Fixnum canna_key_Left;
966 static Fixnum canna_key_Right;
967 static Fixnum canna_key_Down;
968 static Fixnum canna_key_Insert;
969 static Fixnum canna_key_Rollup;
970 static Fixnum canna_key_Rolldown;
971 static Fixnum canna_key_Home;
972 static Fixnum canna_key_Help;
973 static Fixnum canna_key_KP_Key;
974 static Fixnum canna_key_Shift_Nfer;
975 static Fixnum canna_key_Shift_Xfer;
976 static Fixnum canna_key_Shift_Up;
977 static Fixnum canna_key_Shift_Left;
978 static Fixnum canna_key_Shift_Right;
979 static Fixnum canna_key_Shift_Down;
980 static Fixnum canna_key_Cntrl_Nfer;
981 static Fixnum canna_key_Cntrl_Xfer;
982 static Fixnum canna_key_Cntrl_Up;
983 static Fixnum canna_key_Cntrl_Left;
984 static Fixnum canna_key_Cntrl_Right;
985 static Fixnum canna_key_Cntrl_Down;
987 Lisp_Object VCANNA; /* by MORIOKA Tomohiko <morioka@jaist.ac.jp>
990 void syms_of_mule_canna(void)
992 DEFSUBR(Fcanna_key_proc);
993 DEFSUBR(Fcanna_initialize);
994 DEFSUBR(Fcanna_finalize);
995 DEFSUBR(Fcanna_touroku_string);
996 DEFSUBR(Fcanna_set_width);
997 DEFSUBR(Fcanna_change_mode);
998 DEFSUBR(Fcanna_store_yomi);
999 DEFSUBR(Fcanna_do_function);
1000 DEFSUBR(Fcanna_parse);
1001 DEFSUBR(Fcanna_query_mode);
1002 DEFSUBR(Fcanna_set_bunsetsu);
1004 DEFSUBR(Fcanna_henkan_begin);
1005 DEFSUBR(Fcanna_henkan_next);
1006 DEFSUBR(Fcanna_bunsetu_henkou);
1007 DEFSUBR(Fcanna_henkan_kakutei);
1008 DEFSUBR(Fcanna_henkan_end);
1009 DEFSUBR(Fcanna_henkan_quit);
1012 void vars_of_mule_canna(void)
1014 DEFVAR_LISP("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
1015 VCANNA = Qt; /* hir@nec, 1992.5.21 */
1017 DEFVAR_LISP("canna-kakutei-string", &Vcanna_kakutei_string /*
1020 Vcanna_kakutei_string = Qnil;
1022 DEFVAR_LISP("canna-kakutei-yomi", &Vcanna_kakutei_yomi /*
1025 Vcanna_kakutei_yomi = Qnil;
1027 DEFVAR_LISP("canna-kakutei-romaji", &Vcanna_kakutei_romaji /*
1030 Vcanna_kakutei_romaji = Qnil;
1032 DEFVAR_LISP("canna-henkan-string", &Vcanna_henkan_string /*
1035 Vcanna_henkan_string = Qnil;
1037 DEFVAR_INT("canna-henkan-length", &canna_henkan_length /*
1040 canna_henkan_length = 0;
1042 DEFVAR_INT("canna-henkan-revpos", &canna_henkan_revPos /*
1045 canna_henkan_revPos = 0;
1047 DEFVAR_INT("canna-henkan-revlen", &canna_henkan_revLen /*
1050 canna_henkan_revLen = 0;
1052 DEFVAR_LISP("canna-ichiran-string", &Vcanna_ichiran_string /*
1055 Vcanna_ichiran_string = Qnil;
1057 DEFVAR_INT("canna-ichiran-length", &canna_ichiran_length /*
1060 canna_ichiran_length = 0;
1062 DEFVAR_INT("canna-ichiran-revpos", &canna_ichiran_revPos /*
1065 canna_ichiran_revPos = 0;
1067 DEFVAR_INT("canna-ichiran-revlen", &canna_ichiran_revLen /*
1070 canna_ichiran_revLen = 0;
1072 DEFVAR_LISP("canna-mode-string", &Vcanna_mode_string /*
1075 Vcanna_mode_string = Qnil;
1077 DEFVAR_BOOL("canna-empty-info", &canna_empty_info /*
1080 canna_empty_info = 0;
1082 DEFVAR_BOOL("canna-through-info", &canna_through_info /*
1085 canna_through_info = 0;
1087 DEFVAR_BOOL("canna-underline", &canna_underline /*
1090 canna_underline = 0;
1092 DEFVAR_BOOL("canna-inhibit-hankakukana", &canna_inhibit_hankakukana /*
1095 canna_inhibit_hankakukana = 0;
1097 DEFVAR_INT("canna-mode-alpha-mode", &canna_mode_AlphaMode /*
1100 canna_mode_AlphaMode = IROHA_MODE_AlphaMode;
1102 DEFVAR_INT("canna-mode-empty-mode", &canna_mode_EmptyMode /*
1105 canna_mode_EmptyMode = IROHA_MODE_EmptyMode;
1107 DEFVAR_INT("canna-mode-kigo-mode", &canna_mode_KigoMode /*
1110 canna_mode_KigoMode = IROHA_MODE_KigoMode;
1112 DEFVAR_INT("canna-mode-yomi-mode", &canna_mode_YomiMode /*
1115 canna_mode_YomiMode = IROHA_MODE_YomiMode;
1117 DEFVAR_INT("canna-mode-jishu-mode", &canna_mode_JishuMode /*
1120 canna_mode_JishuMode = IROHA_MODE_JishuMode;
1122 DEFVAR_INT("canna-mode-tankouho-mode", &canna_mode_TankouhoMode /*
1125 canna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
1127 DEFVAR_INT("canna-mode-ichiran-mode", &canna_mode_IchiranMode /*
1130 canna_mode_IchiranMode = IROHA_MODE_IchiranMode;
1132 DEFVAR_INT("canna-mode-yes-no-mode", &canna_mode_YesNoMode /*
1135 canna_mode_YesNoMode = IROHA_MODE_YesNoMode;
1137 DEFVAR_INT("canna-mode-on-off-mode", &canna_mode_OnOffMode /*
1140 canna_mode_OnOffMode = IROHA_MODE_OnOffMode;
1142 #ifdef CANNA_MODE_AdjustBunsetsuMode
1143 DEFVAR_INT("canna-mode-adjust-bunsetsu-mode", &canna_mode_AdjustBunsetsuMode /*
1146 canna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
1148 #ifdef CANNA_MODE_ChikujiYomiMode
1149 DEFVAR_INT("canna-mode-chikuji-yomi-mode", &canna_mode_ChikujiYomiMode /*
1152 canna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
1154 DEFVAR_INT("canna-mode-chikuji-bunsetsu-mode", &canna_mode_ChikujiTanMode /*
1157 canna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
1160 DEFVAR_INT("canna-mode-henkan-mode", &canna_mode_HenkanMode /*
1163 canna_mode_HenkanMode = IROHA_MODE_HenkanMode;
1165 #ifdef CANNA_MODE_HenkanNyuryokuMode
1166 DEFVAR_INT("canna-mode-henkan-nyuuryoku-mode", &canna_mode_HenkanNyuryokuMode /*
1169 canna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
1171 #ifdef CANNA_MODE_ZenHiraHenkanMode
1172 DEFVAR_INT("canna-mode-zen-hira-henkan-mode", &canna_mode_ZenHiraHenkanMode /*
1175 canna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
1176 #ifdef CANNA_MODE_HanHiraHenkanMode
1177 DEFVAR_INT("canna-mode-han-hira-henkan-mode", &canna_mode_HanHiraHenkanMode /*
1180 canna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
1182 DEFVAR_INT("canna-mode-zen-kata-henkan-mode", &canna_mode_ZenKataHenkanMode /*
1185 canna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
1187 DEFVAR_INT("canna-mode-han-kata-henkan-mode", &canna_mode_HanKataHenkanMode /*
1190 canna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
1192 DEFVAR_INT("canna-mode-zen-alpha-henkan-mode", &canna_mode_ZenAlphaHenkanMode /*
1195 canna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
1197 DEFVAR_INT("canna-mode-han-alpha-henkan-mode", &canna_mode_HanAlphaHenkanMode /*
1200 canna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
1202 DEFVAR_INT("canna-mode-zen-hira-kakutei-mode", &canna_mode_ZenHiraKakuteiMode /*
1205 canna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
1206 #ifdef CANNA_MODE_HanHiraKakuteiMode
1207 DEFVAR_INT("canna-mode-han-hira-kakutei-mode", &canna_mode_HanHiraKakuteiMode /*
1210 canna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
1212 DEFVAR_INT("canna-mode-zen-kata-kakutei-mode", &canna_mode_ZenKataKakuteiMode /*
1215 canna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
1217 DEFVAR_INT("canna-mode-han-kata-kakutei-mode", &canna_mode_HanKataKakuteiMode /*
1220 canna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
1222 DEFVAR_INT("canna-mode-zen-alpha-kakutei-mode", &canna_mode_ZenAlphaKakuteiMode /*
1225 canna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
1227 DEFVAR_INT("canna-mode-han-alpha-kakutei-mode", &canna_mode_HanAlphaKakuteiMode /*
1230 canna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
1232 DEFVAR_INT("canna-mode-hex-mode", &canna_mode_HexMode /*
1235 canna_mode_HexMode = IROHA_MODE_HexMode;
1237 DEFVAR_INT("canna-mode-bushu-mode", &canna_mode_BushuMode /*
1240 canna_mode_BushuMode = IROHA_MODE_BushuMode;
1242 DEFVAR_INT("canna-mode-extend-mode", &canna_mode_ExtendMode /*
1245 canna_mode_ExtendMode = IROHA_MODE_ExtendMode;
1247 DEFVAR_INT("canna-mode-russian-mode", &canna_mode_RussianMode /*
1250 canna_mode_RussianMode = IROHA_MODE_RussianMode;
1252 DEFVAR_INT("canna-mode-greek-mode", &canna_mode_GreekMode /*
1255 canna_mode_GreekMode = IROHA_MODE_GreekMode;
1257 DEFVAR_INT("canna-mode-line-mode", &canna_mode_LineMode /*
1260 canna_mode_LineMode = IROHA_MODE_LineMode;
1262 DEFVAR_INT("canna-mode-changing-server-mode", &canna_mode_ChangingServerMode /*
1265 canna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
1267 DEFVAR_INT("canna-mode-henkan-method-mode", &canna_mode_HenkanMethodMode /*
1270 canna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
1272 DEFVAR_INT("canna-mode-delete-dic-mode", &canna_mode_DeleteDicMode /*
1275 canna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
1277 DEFVAR_INT("canna-mode-touroku-mode", &canna_mode_TourokuMode /*
1280 canna_mode_TourokuMode = IROHA_MODE_TourokuMode;
1282 DEFVAR_INT("canna-mode-touroku-empty-mode", &canna_mode_TourokuEmptyMode /*
1285 canna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
1287 DEFVAR_INT("canna-mode-touroku-hinshi-mode", &canna_mode_TourokuHinshiMode /*
1290 canna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
1292 DEFVAR_INT("canna-mode-touroku-dic-mode", &canna_mode_TourokuDicMode /*
1295 canna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
1297 DEFVAR_INT("canna-mode-quoted-insert-mode", &canna_mode_QuotedInsertMode /*
1300 canna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
1302 DEFVAR_INT("canna-mode-bubun-muhenkan-mode", &canna_mode_BubunMuhenkanMode /*
1305 canna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
1307 DEFVAR_INT("canna-mode-mount-dic-mode", &canna_mode_MountDicMode /*
1310 canna_mode_MountDicMode = IROHA_MODE_MountDicMode;
1312 DEFVAR_INT("canna-func-self-insert", &canna_fn_SelfInsert /*
1315 canna_fn_SelfInsert = IROHA_FN_SelfInsert;
1317 DEFVAR_INT("canna-func-functional-insert", &canna_fn_FunctionalInsert /*
1320 canna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
1322 DEFVAR_INT("canna-func-quoted-insert", &canna_fn_QuotedInsert /*
1325 canna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
1327 DEFVAR_INT("canna-func-japanese-mode", &canna_fn_JapaneseMode /*
1330 canna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
1332 DEFVAR_INT("canna-func-alpha-mode", &canna_fn_AlphaMode /*
1335 canna_fn_AlphaMode = IROHA_FN_AlphaMode;
1337 DEFVAR_INT("canna-func-henkan-nyuryoku-mode", &canna_fn_HenkanNyuryokuMode /*
1340 canna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
1342 DEFVAR_INT("canna-func-forward", &canna_fn_Forward /*
1345 canna_fn_Forward = IROHA_FN_Forward;
1347 DEFVAR_INT("canna-func-backward", &canna_fn_Backward /*
1350 canna_fn_Backward = IROHA_FN_Backward;
1352 DEFVAR_INT("canna-func-next", &canna_fn_Next /*
1355 canna_fn_Next = IROHA_FN_Next;
1357 DEFVAR_INT("canna-func-previous", &canna_fn_Prev /*
1360 canna_fn_Prev = IROHA_FN_Prev;
1362 DEFVAR_INT("canna-func-beginning-of-line", &canna_fn_BeginningOfLine /*
1365 canna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
1367 DEFVAR_INT("canna-func-end-of-line", &canna_fn_EndOfLine /*
1370 canna_fn_EndOfLine = IROHA_FN_EndOfLine;
1372 DEFVAR_INT("canna-func-delete-next", &canna_fn_DeleteNext /*
1375 canna_fn_DeleteNext = IROHA_FN_DeleteNext;
1377 DEFVAR_INT("canna-func-delete-previous", &canna_fn_DeletePrevious /*
1380 canna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
1382 DEFVAR_INT("canna-func-kill-to-end-of-line", &canna_fn_KillToEndOfLine /*
1385 canna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
1387 DEFVAR_INT("canna-func-henkan", &canna_fn_Henkan /*
1390 canna_fn_Henkan = IROHA_FN_Henkan;
1392 DEFVAR_INT("canna-func-kakutei", &canna_fn_Kakutei /*
1395 canna_fn_Kakutei = IROHA_FN_Kakutei;
1397 DEFVAR_INT("canna-func-extend", &canna_fn_Extend /*
1400 canna_fn_Extend = IROHA_FN_Extend;
1402 DEFVAR_INT("canna-func-shrink", &canna_fn_Shrink /*
1405 canna_fn_Shrink = IROHA_FN_Shrink;
1407 #ifdef CANNA_FN_AdjustBunsetsu
1408 DEFVAR_INT("canna-func-adjust-bunsetsu", &canna_fn_AdjustBunsetsu /*
1411 canna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
1413 DEFVAR_INT("canna-func-quit", &canna_fn_Quit /*
1416 canna_fn_Quit = IROHA_FN_Quit;
1418 DEFVAR_INT("canna-func-convert-as-hex", &canna_fn_ConvertAsHex /*
1421 canna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
1423 DEFVAR_INT("canna-func-convert-as-bushu", &canna_fn_ConvertAsBushu /*
1426 canna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
1428 DEFVAR_INT("canna-func-kouho-ichiran", &canna_fn_KouhoIchiran /*
1431 canna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
1433 DEFVAR_INT("canna-func-bubun-muhenkan", &canna_fn_BubunMuhenkan /*
1436 canna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
1438 DEFVAR_INT("canna-func-zenkaku", &canna_fn_Zenkaku /*
1441 canna_fn_Zenkaku = IROHA_FN_Zenkaku;
1443 DEFVAR_INT("canna-func-hankaku", &canna_fn_Hankaku /*
1446 canna_fn_Hankaku = IROHA_FN_Hankaku;
1448 DEFVAR_INT("canna-func-to-upper", &canna_fn_ToUpper /*
1451 canna_fn_ToUpper = IROHA_FN_ToUpper;
1453 DEFVAR_INT("canna-func-capitalize", &canna_fn_Capitalize /*
1456 canna_fn_Capitalize = IROHA_FN_Capitalize;
1458 DEFVAR_INT("canna-func-to-lower", &canna_fn_ToLower /*
1461 canna_fn_ToLower = IROHA_FN_ToLower;
1463 DEFVAR_INT("canna-func-hiragana", &canna_fn_Hiragana /*
1466 canna_fn_Hiragana = IROHA_FN_Hiragana;
1468 DEFVAR_INT("canna-func-katakana", &canna_fn_Katakana /*
1471 canna_fn_Katakana = IROHA_FN_Katakana;
1473 DEFVAR_INT("canna-func-romaji", &canna_fn_Romaji /*
1476 canna_fn_Romaji = IROHA_FN_Romaji;
1478 #ifdef CANNA_FN_BaseHiragana
1479 DEFVAR_INT("canna-func-base-hiragana", &canna_fn_BaseHiragana /*
1482 canna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
1484 DEFVAR_INT("canna-func-base-katakana", &canna_fn_BaseKatakana /*
1487 canna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
1489 DEFVAR_INT("canna-func-base-eisu", &canna_fn_BaseEisu /*
1492 canna_fn_BaseEisu = CANNA_FN_BaseEisu;
1494 DEFVAR_INT("canna-func-base-zenkaku", &canna_fn_BaseZenkaku /*
1497 canna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
1499 DEFVAR_INT("canna-func-base-hankaku", &canna_fn_BaseHankaku /*
1502 canna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
1504 DEFVAR_INT("canna-func-base-kana", &canna_fn_BaseKana /*
1507 canna_fn_BaseKana = CANNA_FN_BaseKana;
1509 DEFVAR_INT("canna-func-base-kakutei", &canna_fn_BaseKakutei /*
1512 canna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
1514 DEFVAR_INT("canna-func-base-henkan", &canna_fn_BaseHenkan /*
1517 canna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
1519 DEFVAR_INT("canna-func-base-hiragana-katakana-toggle", &canna_fn_BaseHiraKataToggle /*
1522 canna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
1524 DEFVAR_INT("canna-func-base-zenkaku-hankaku-toggle", &canna_fn_BaseZenHanToggle /*
1527 canna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
1529 DEFVAR_INT("canna-func-base-kana-eisu-toggle", &canna_fn_BaseKanaEisuToggle /*
1532 canna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
1534 DEFVAR_INT("canna-func-base-kakutei-henkan-toggle", &canna_fn_BaseKakuteiHenkanToggle /*
1537 canna_fn_BaseKakuteiHenkanToggle = CANNA_FN_BaseKakuteiHenkanToggle;
1539 DEFVAR_INT("canna-func-base-rotate-forward", &canna_fn_BaseRotateForward /*
1542 canna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
1544 DEFVAR_INT("canna-func-base-rotate-backward", &canna_fn_BaseRotateBackward /*
1547 canna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
1550 DEFVAR_INT("canna-func-extend-mode", &canna_fn_ExtendMode /*
1553 canna_fn_ExtendMode = IROHA_FN_ExtendMode;
1555 DEFVAR_INT("canna-func-touroku", &canna_fn_Touroku /*
1558 canna_fn_Touroku = IROHA_FN_Touroku;
1560 DEFVAR_INT("canna-func-hex-mode", &canna_fn_HexMode /*
1563 canna_fn_HexMode = IROHA_FN_HexMode;
1565 DEFVAR_INT("canna-func-bushu-mode", &canna_fn_BushuMode /*
1568 canna_fn_BushuMode = IROHA_FN_BushuMode;
1570 DEFVAR_INT("canna-func-kigo-mode", &canna_fn_KigouMode /*
1573 canna_fn_KigouMode = IROHA_FN_KigouMode;
1575 #ifdef CANNA_FN_Mark
1576 DEFVAR_INT("canna-func-mark", &canna_fn_Mark /*
1579 canna_fn_Mark = CANNA_FN_Mark;
1581 #ifdef CANNA_FN_TemporalMode
1582 DEFVAR_INT("canna-func-temporal-mode", &canna_fn_TemporalMode /*
1585 canna_fn_TemporalMode = CANNA_FN_TemporalMode;
1588 DEFVAR_INT("canna-key-nfer", &canna_key_Nfer /*
1591 canna_key_Nfer = IROHA_KEY_Nfer;
1593 DEFVAR_INT("canna-key-xfer", &canna_key_Xfer /*
1596 canna_key_Xfer = IROHA_KEY_Xfer;
1598 DEFVAR_INT("canna-key-up", &canna_key_Up /*
1601 canna_key_Up = IROHA_KEY_Up;
1603 DEFVAR_INT("canna-key-left", &canna_key_Left /*
1606 canna_key_Left = IROHA_KEY_Left;
1608 DEFVAR_INT("canna-key-right", &canna_key_Right /*
1611 canna_key_Right = IROHA_KEY_Right;
1613 DEFVAR_INT("canna-key-down", &canna_key_Down /*
1616 canna_key_Down = IROHA_KEY_Down;
1618 DEFVAR_INT("canna-key-insert", &canna_key_Insert /*
1621 canna_key_Insert = IROHA_KEY_Insert;
1623 DEFVAR_INT("canna-key-rollup", &canna_key_Rollup /*
1626 canna_key_Rollup = IROHA_KEY_Rollup;
1628 DEFVAR_INT("canna-key-rolldown", &canna_key_Rolldown /*
1631 canna_key_Rolldown = IROHA_KEY_Rolldown;
1633 DEFVAR_INT("canna-key-home", &canna_key_Home /*
1636 canna_key_Home = IROHA_KEY_Home;
1638 DEFVAR_INT("canna-key-help", &canna_key_Help /*
1641 canna_key_Help = IROHA_KEY_Help;
1643 DEFVAR_INT("canna-key-kp-key", &canna_key_KP_Key /*
1646 canna_key_KP_Key = IROHA_KEY_KP_Key;
1648 DEFVAR_INT("canna-key-shift-nfer", &canna_key_Shift_Nfer /*
1651 canna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
1653 DEFVAR_INT("canna-key-shift-xfer", &canna_key_Shift_Xfer /*
1656 canna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
1658 DEFVAR_INT("canna-key-shift-up", &canna_key_Shift_Up /*
1661 canna_key_Shift_Up = IROHA_KEY_Shift_Up;
1663 DEFVAR_INT("canna-key-shift-left", &canna_key_Shift_Left /*
1666 canna_key_Shift_Left = IROHA_KEY_Shift_Left;
1668 DEFVAR_INT("canna-key-shift-right", &canna_key_Shift_Right /*
1671 canna_key_Shift_Right = IROHA_KEY_Shift_Right;
1673 DEFVAR_INT("canna-key-shift-down", &canna_key_Shift_Down /*
1676 canna_key_Shift_Down = IROHA_KEY_Shift_Down;
1678 DEFVAR_INT("canna-key-control-nfer", &canna_key_Cntrl_Nfer /*
1681 canna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
1683 DEFVAR_INT("canna-key-control-xfer", &canna_key_Cntrl_Xfer /*
1686 canna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
1688 DEFVAR_INT("canna-key-control-up", &canna_key_Cntrl_Up /*
1691 canna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
1693 DEFVAR_INT("canna-key-control-left", &canna_key_Cntrl_Left /*
1696 canna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
1698 DEFVAR_INT("canna-key-control-right", &canna_key_Cntrl_Right /*
1701 canna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
1703 DEFVAR_INT("canna-key-control-down", &canna_key_Cntrl_Down /*
1706 canna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
1708 Fprovide(intern("CANNA"));
1712 /* To handle MULE internal code and EUC.
1713 I assume CANNA can handle only Japanese EUC. */
1715 /* EUC multibyte string to MULE internal string */
1717 static void c2mu(unsigned char *cp, int l, unsigned char *mp)
1719 unsigned char ch, *ep = cp + l;
1721 while ((cp < ep) && (ch = *cp)) {
1722 if ((unsigned char)ch == ISO_CODE_SS2) {
1723 *mp++ = LEADING_BYTE_KATAKANA_JISX0201;
1725 } else if ((unsigned char)ch == ISO_CODE_SS3) {
1726 *mp++ = LEADING_BYTE_JAPANESE_JISX0212;
1729 } else if (ch & 0x80) {
1730 *mp++ = LEADING_BYTE_JAPANESE_JISX0208;
1738 /* MULE internal string to EUC multibyte string */
1740 static void m2c(unsigned char *mp, int l, unsigned char *cp)
1742 unsigned char ch, *ep = mp + l;
1744 while ((mp < ep) && (ch = *mp++)) {
1746 case LEADING_BYTE_KATAKANA_JISX0201:
1747 *cp++ = ISO_CODE_SS2;
1750 case LEADING_BYTE_JAPANESE_JISX0212:
1751 *cp++ = ISO_CODE_SS3;
1752 case LEADING_BYTE_JAPANESE_JISX0208:
1766 /* make_string after converting EUC string to MULE internal string */
1767 static Lisp_Object mule_make_string(unsigned char *p, int l)
1769 unsigned char cbuf[4096];
1772 return (make_string(cbuf, strlen(cbuf)));
1775 /* return the MULE internal string length of EUC string */
1776 /* Modified by sb to return a character count not byte count. */
1777 static int mule_strlen(unsigned char *p, int l)
1779 unsigned char ch, *cp = p;
1782 while ((cp < p + l) && (ch = *cp)) {
1783 if ((unsigned char)ch == ISO_CODE_SS2) {
1786 } else if ((unsigned char)ch == ISO_CODE_SS3) {
1789 } else if (ch & 0x80) {
1800 /* count number of characters */
1802 count_char(unsigned char *p, int len, int pos, int rev,
1803 Fixnum * clen, Fixnum * cpos, Fixnum * crev)
1805 unsigned char *q = p;
1807 *clen = *cpos = *crev = 0;
1810 while (q < p + pos) {
1816 while (q < p + pos + rev) {
1822 while (q < p + len) {
1828 #endif /* CANNA_MULE */