3 Copyright (C) 1995 Free Software Foundation, Inc.
4 Copyright (C) 1995 Sun Microsystems, Inc.
6 This file is part of XEmacs.
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
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
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. */
23 /* Synched up with: Mule 2.3. Not in FSF. */
25 /* #### The comments in this file are mostly in EUC-formatted Japanese.
26 It would be ***soooo*** much nicer if someone could translate
31 Authors: Akira Kon (kon@uxd.fc.nec.co.jp)
32 Ichiro Hirakura (hirakura@uxd.fc.nec.co.jp)
34 Functions defined in this file are
39 Length of converted string if no error occurs.
40 Error string if error occurs.
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.
50 List of the following things:
51 - list of keys to toggle Japanese-mode
53 - list of warning messages
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
67 list of warning messages
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
74 (canna-touroku-string string)
76 String to register to a dictionary.
78 The same thing returns as canna-key-proc does.
80 Register Kanji words into kana-to-kanji
81 conversion dictionary.
83 (canna-set-width width)
85 Column width of the place where the candidates
86 of kana-to-kanji conversion will be shown.
90 Set status-line width information, which is
91 used to display kanji candidates.
93 (canna-change-mode num)
95 The mode number of Canna.
97 The same thing returns as canna-key-proc does.
99 Change Japanese pre-edit mode.
101 (canna-store-yomi yomi roma)
103 ``Yomi'' to be stored.
105 ``Romaji'' which corresponds to the ``Yomi''.
107 The same thing returns as canna-key-proc does.
109 Store yomi characters as a YOMI of
110 kana-to-kanji conversion.
112 (canna-do-function num ch)
114 A function number to be called.
116 A character will be specified in order to feed
117 the character to the function if the function
118 needs a input character.
120 The same thing returns as canna-key-proc does.
122 Do specified function at current mode.
128 List of warning messages.
130 Parse customize string.
134 A string which indicate the current mode.
136 Get current mode string.
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.
145 (canna-bunsetu-henkou)
146 (canna-henkan-kakutei)
156 #include "file-coding.h"
160 #include "canna/jrkanji.h"
161 #include "canna/RK.h"
163 #include "iroha/jrkanji.h"
164 #include "iroha/RK.h"
166 extern char *jrKanjiError;
168 #define KEYTOSTRSIZE 2048
169 static unsigned char buf[KEYTOSTRSIZE];
170 static char **warning;
172 static int Vcanna_empty_info, Vcanna_through_info;
173 static int Vcanna_underline;
174 static int Vcanna_inhibit_hankakukana;
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;
189 static int IRCP_context;
191 static Lisp_Object storeResults (unsigned char *, int, jrKanjiStatus *);
192 static Lisp_Object kanjiYomiList (int, int);
195 static void m2c (unsigned char *, int, unsigned char *);
196 static Lisp_Object mule_make_string (unsigned char *, int);
197 static int mule_strlen (unsigned char *, int);
198 static void count_char (unsigned char *,int, int, int, int *, int *, int *);
199 #define make_string mule_make_string
202 /* Lisp functions definition */
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
215 CHECK_CHAR_COERCE_INT (ch);
216 len = jrKanjiString (0, XCHAR (ch), buf, KEYTOSTRSIZE, &ks);
217 return storeResults (buf, len, &ks);
221 storeResults (unsigned char *buf, int len, jrKanjiStatus *ks)
223 Lisp_Object val = Qnil;
226 { /* Error detected */
227 val = make_string ((unsigned char*) jrKanjiError, strlen (jrKanjiError));
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)
238 unsigned char *p = buf + len + 1;
239 int yomilen = strlen (p);
241 if (len + yomilen + 1 < KEYTOSTRSIZE)
245 Vcanna_kakutei_yomi = make_string (p, yomilen); /* ÆÉ¤ß */
247 yomilen2 = strlen (p);
248 if (len + yomilen + yomilen2 + 2 < KEYTOSTRSIZE)
250 Vcanna_kakutei_romaji = make_string (p, yomilen2); /* ¥í¡¼¥Þ»ú */
256 /* ¸õÊäɽ¼¨¤Îʸ»úÎó¤Ç¤¹¡£*/
257 Vcanna_henkan_string = Qnil;
260 Vcanna_henkan_string = make_string (ks->echoStr, ks->length);
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)
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);
274 count_char (ks->echoStr, ks->length, ks->revPos, ks->revLen,
275 &Vcanna_henkan_length, &Vcanna_henkan_revPos,
276 &Vcanna_henkan_revLen);
278 #endif /* CANNA_MULE */
282 Vcanna_ichiran_string = Qnil;
283 if (ks->info & KanjiGLineInfo && ks->gline.length >= 0)
285 Vcanna_ichiran_string = make_string (ks->gline.line, ks->gline.length);
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 */
298 Vcanna_mode_string = Qnil;
299 if (ks->info & KanjiModeInfo)
301 Vcanna_mode_string = make_string (ks->mode, strlen (ks->mode));
305 Vcanna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
306 Vcanna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0;
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.
319 int kugiri; /* ʸÀá¶èÀÚ¤ê¤ò¤¹¤ë¤«¡© */
321 kugiri = NILP (num) ? 0 : 1;
323 jrKanjiControl (0, KC_SETBUNSETSUKUGIRI, (char *) kugiri);
328 /* For whatever reason, calling Fding directly from libCanna loses */
329 static void call_Fding()
331 extern Lisp_Object Fding();
333 Fding (Qnil, Qnil, Qnil);
336 DEFUN ("canna-initialize", Fcanna_initialize, 0, 3, 0, /*
337 Initialize ``canna'', which is a kana-to-kanji converter for GNU Emacs.
338 The first arg specifies if inserting space character between BUNSETSU when
339 candidates are displayed.
340 The second arg specifies server.
341 The third arg specifies a file which will be used as a customization
343 If nil is specified for each arg, the default value will be used.
345 (num, server, rcfile))
349 unsigned char **p, **q;
351 int kugiri; /* ʸÀá¶èÀÚ¤ê¤ò¤¹¤ë¤«¡© */
363 kugiri = (kugiri == 1) ? 1 : 0;
368 jrKanjiControl (0, KC_SETSERVERNAME, (char *) 0);
372 char servername[256];
374 CHECK_STRING (server);
375 strncpy (servername, XSTRING (server)->_data, XSTRING (server)->_size);
376 servername[XSTRING (server)->_size] = '\0';
377 jrKanjiControl (0, KC_SETSERVERNAME, servername);
382 jrKanjiControl (0, KC_SETINITFILENAME, (char *) 0);
388 CHECK_STRING (rcfile);
389 strncpy (rcname, XSTRING (rcfile)->_data, XSTRING (rcfile)->_size);
390 rcname[XSTRING (rcfile)->_size] = '\0';
391 jrKanjiControl (0, KC_SETINITFILENAME, rcname);
394 warning = (char **) 0;
397 #endif /* nec_ews_svr4 */
398 res = jrKanjiControl (0, KC_INITIALIZE, (char *)&warning);
401 #endif /* nec_ews_svr4 */
405 for (p = q = (unsigned char **) warning ; *q ; q++)
410 val = Fcons (make_string (*q, strlen (*q)), val);
413 val = Fcons (val, Qnil);
417 val = Fcons (make_string ((unsigned char*) jrKanjiError,
418 strlen (jrKanjiError)), val);
419 /* ¥¤¥Ë¥·¥ã¥é¥¤¥º¤Ç¼ºÇÔ¤·¤¿¾ì¹ç¡£ */
420 return Fcons (Qnil, val);
424 extern void (*jrBeepFunc)();
425 Lisp_Object CANNA_mode_keys ();
427 jrBeepFunc = call_Fding;
431 wcKanjiControl (0, KC_SETAPPNAME, "nemacs");
432 #else /* CANNA_MULE */
433 wcKanjiControl (0, KC_SETAPPNAME, "mule");
434 #endif /* CANNA_MULE */
435 #endif /* KC_SETAPPNAME */
437 jrKanjiControl (0, KC_SETBUNSETSUKUGIRI, (char *) kugiri);
438 jrKanjiControl (0, KC_SETWIDTH, (char *) 78);
440 jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1);
442 /* mule ¤À¤Ã¤¿¤éȾ³Ñ¥«¥¿¥«¥Ê¤â»È¤¨¤ë */
443 if (Vcanna_inhibit_hankakukana)
444 jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1);
446 jrKanjiControl (0, KC_YOMIINFO, (char *) 2); /* ¢¨£²: ¥í¡¼¥Þ»ú¤Þ¤ÇÊÖ¤¹ */
447 val = Fcons (Qnil, val);
448 return Fcons (CANNA_mode_keys (), val);
452 DEFUN ("canna-finalize", Fcanna_finalize, 0, 0, 0, /*
453 finalize ``canna'', which is a kana-to-kanji converter for GNU Emacs.
454 This cause to write miscellaneous informations to kana-to-kanji dictionary.
461 jrKanjiControl (0, KC_FINALIZE, (char *)&warning);
466 for (p = (unsigned char**) warning ; *p ; p++)
468 val = Fcons (make_string (*p, strlen (*p)), val);
471 val = Fcons (val, Qnil);
476 DEFUN ("canna-touroku-string", Fcanna_touroku_string, 1, 1, 0, /*
477 Register Kanji words into kana-to-kanji conversion dictionary.
481 jrKanjiStatusWithValue ksv;
486 unsigned char cbuf[4096];
490 ksv.buffer = (unsigned char *) buf;
491 ksv.bytes_buffer = KEYTOSTRSIZE;
493 ks.echoStr = XSTRING (str)->_data;
494 ks.length = XSTRING (str)->_size;
495 #else /* CANNA_MULE */
496 m2c (XSTRING (str)->_data, XSTRING (str)->_size, cbuf);
498 ks.length = strlen (cbuf);
499 #endif /* CANNA_MULE */
501 len = jrKanjiControl (0, KC_DEFINEKANJI, (char *)&ksv);
502 val = storeResults (buf, ksv.val, ksv.ks);
506 DEFUN ("canna-set-width", Fcanna_set_width, 1, 1, 0, /*
507 Set status-line width information, which is used to display
514 jrKanjiControl (0, KC_SETWIDTH, (char *) XINT (num));
518 DEFUN ("canna-change-mode", Fcanna_change_mode, 1, 1, 0, /*
519 Change Japanese pre-edit mode.
523 jrKanjiStatusWithValue ksv;
529 ksv.buffer = (unsigned char *) buf;
530 ksv.bytes_buffer = KEYTOSTRSIZE;
532 ksv.val = XINT (num);
533 jrKanjiControl (0, KC_CHANGEMODE, (char *)&ksv);
534 val = storeResults (buf, ksv.val, ksv.ks);
539 CANNA_mode_keys (void)
541 #define CANNAWORKBUFSIZE 32
542 char xxx[CANNAWORKBUFSIZE];
546 n = jrKanjiControl (0, KC_MODEKEYS, xxx);
548 for (i = n ; i > 0 ;)
551 /* !!#### something fucked here */
552 val = Fcons (make_char ((int)(0xFF & (unsigned char) xxx[i])), val);
557 DEFUN ("canna-store-yomi", Fcanna_store_yomi, 1, 2, 0, /*
558 Store yomi characters as a YOMI of kana-to-kanji conversion.
562 jrKanjiStatusWithValue ksv;
567 strncpy (buf, XSTRING (yomi)->_data, XSTRING (yomi)->_size);
568 ks.length = XSTRING (yomi)->_size;
569 buf[ks.length] = '\0';
570 #else /* CANNA_MULE */
571 m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, buf);
572 ks.length = strlen (buf);
573 #endif /* CANNA_MULE */
584 strncpy (buf + XSTRING (yomi)->_size + 1, XSTRING (roma)->_data,
585 XSTRING (roma)->_size);
586 buf[XSTRING (yomi)->_size + 1 + XSTRING (roma)->_size] = '\0';
587 ks.mode = (unsigned char *)(buf + XSTRING (yomi)->_size + 1);
588 #else /* CANNA_MULE */
589 ks.mode = (unsigned char *)(buf + ks.length + 1);
590 m2c (XSTRING (roma)->_data, XSTRING (roma)->_size, ks.mode);
591 #endif /* CANNA_MULE */
594 ks.echoStr = (unsigned char *) buf;
595 ksv.buffer = (unsigned char *) buf; /* ÊÖÃÍÍÑ */
596 ksv.bytes_buffer = KEYTOSTRSIZE;
599 jrKanjiControl (0, KC_STOREYOMI, (char *)&ksv);
601 return storeResults (buf, ksv.val, ksv.ks);
604 DEFUN ("canna-do-function", Fcanna_do_function, 1, 2, 0, /*
605 Do specified function at current mode.
609 jrKanjiStatusWithValue ksv;
625 ksv.buffer = (unsigned char *) buf;
626 ksv.bytes_buffer = KEYTOSTRSIZE;
628 ksv.val = XINT (num);
629 jrKanjiControl (0, KC_DO, (char *) &ksv);
630 val = storeResults (buf, ksv.val, ksv.ks);
634 DEFUN ("canna-parse", Fcanna_parse, 1, 1, 0, /*
635 Parse customize string.
646 strncpy (buf, XSTRING (str)->_data, XSTRING (str)->_size);
647 buf[XSTRING (str)->_size] = '\0';
648 #else /* CANNA_MULE */
649 m2c (XSTRING (str)->_data, XSTRING (str)->_size, buf);
650 #endif /* CANNA_MULE */
651 p = (unsigned char**) buf;
652 n = jrKanjiControl (0, KC_PARSE, (char *) &p);
657 val = Fcons (make_string (p[n], strlen (p[n])), val);
662 DEFUN ("canna-query-mode", Fcanna_query_mode, 0, 0, 0, /*
663 Get current mode string.
667 unsigned char buf[256];
669 jrKanjiControl (0, KC_QUERYMODE, buf);
670 return make_string (buf, strlen (buf));
674 * Functions following this line are for KKCP interface compatible
675 * library. These functions may be used by MILK system.
678 #define RKBUFSIZE 1024
680 static unsigned char yomibuf[RKBUFSIZE];
681 static short kugiri[RKBUFSIZE / 2];
684 confirmContext (void)
686 if (IRCP_context < 0)
690 if ((context = jrKanjiControl (0, KC_GETCONTEXT, (char *) 0)) == -1)
694 IRCP_context = context;
700 byteLen (int bun, int len)
702 int i = 0, offset = 0, ch;
704 if (0 <= bun && bun < RKBUFSIZE)
706 offset = kugiri[bun];
709 while (len-- > 0 && (ch = (int) yomibuf[offset + i]))
720 DEFUN ("canna-henkan-begin", Fcanna_henkan_begin, 1, 1, 0, /*
721 ¤«¤Ê´Á»úÊÑ´¹¤·¤¿·ë²Ì¤òÊÖ´Ô¤¹¤ë¡£Ê¸ÀáÀڤ꤬¤·¤Æ¤¢¤ë¡£
728 if (confirmContext () == 0)
733 strncpy (yomibuf, XSTRING (yomi)->_data, XSTRING (yomi)->_size);
734 yomibuf[XSTRING (yomi)->_size] = '\0';
735 nbun = RkBgnBun (IRCP_context, XSTRING (yomi)->_data, XSTRING (yomi)->_size,
736 (RK_XFER << RK_XFERBITS) | RK_KFER);
737 #else /* CANNA_MULE */
738 m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, yomibuf);
739 nbun = RkBgnBun (IRCP_context, (char *) yomibuf, strlen (yomibuf),
740 (RK_XFER << RK_XFERBITS) | RK_KFER);
741 #endif /* CANNA_MULE */
743 return kanjiYomiList (IRCP_context, nbun);
747 kanjiYomiList (int context, int nbun)
749 Lisp_Object val, res = Qnil;
750 unsigned char RkBuf[RKBUFSIZE];
753 for (i = nbun ; i > 0 ; )
757 len = RkGetKanji (context, RkBuf, RKBUFSIZE);
758 val = make_string (RkBuf, len);
759 len = RkGetYomi (context, RkBuf, RKBUFSIZE);
760 res = Fcons (Fcons (val, make_string (RkBuf, len)), res);
761 if (i < RKBUFSIZE / 2)
766 for (i = 0, total = 0 ; i < nbun ; i++)
768 int temp = kugiri[i];
775 DEFUN ("canna-henkan-next", Fcanna_henkan_next, 1, 1, 0, /*
781 unsigned char *p, RkBuf[RKBUFSIZE];
782 Lisp_Object res = Qnil, endp;
784 CHECK_INT (bunsetsu);
785 if (confirmContext () == 0)
789 RkGoTo (IRCP_context, XINT (bunsetsu));
790 len = RkGetKanjiList (IRCP_context, RkBuf, RKBUFSIZE);
792 for (i = 0 ; i < len ; i++)
797 endp = res = Fcons (make_string (p, slen), Qnil);
801 endp = XCDR (endp) = Fcons (make_string (p, slen), Qnil);
808 DEFUN ("canna-bunsetu-henkou", Fcanna_bunsetu_henkou, 2, 2, 0, /*
809 ʸÀá¤ÎŤµ¤ò»ØÄꤹ¤ë¡£
815 CHECK_INT (bunsetsu);
818 nbun = XINT (bunsetsu);
819 if (confirmContext () == 0)
823 RkGoTo (IRCP_context, nbun);
824 len = byteLen (nbun, XINT (bunlen));
825 return kanjiYomiList (IRCP_context, RkResize (IRCP_context, len));
828 DEFUN ("canna-henkan-kakutei", Fcanna_henkan_kakutei, 2, 2, 0, /*
835 if (confirmContext () == 0)
840 RkGoTo (IRCP_context, nbun);
842 nkouho = XINT(kouho);
843 RkXfer (IRCP_context, nkouho);
847 DEFUN ("canna-henkan-end", Fcanna_henkan_end, 0, 0, 0, /*
852 if (confirmContext () == 0)
856 RkEndBun (IRCP_context, 1); /* ³Ø½¬¤Ï¤¤¤Ä¤Ç¤â¹Ô¤Ã¤ÆÎɤ¤¤â¤Î¤Ê¤Î¤«¡© */
860 DEFUN ("canna-henkan-quit", Fcanna_henkan_quit, 0, 0, 0, /*
865 if (confirmContext () == 0)
869 RkEndBun (IRCP_context, 0);
873 /* variables below this line is constants of Canna */
875 static int Vcanna_mode_AlphaMode = IROHA_MODE_AlphaMode;
876 static int Vcanna_mode_EmptyMode = IROHA_MODE_EmptyMode;
877 static int Vcanna_mode_KigoMode = IROHA_MODE_KigoMode;
878 static int Vcanna_mode_YomiMode = IROHA_MODE_YomiMode;
879 static int Vcanna_mode_JishuMode = IROHA_MODE_JishuMode;
880 static int Vcanna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
881 static int Vcanna_mode_IchiranMode = IROHA_MODE_IchiranMode;
882 static int Vcanna_mode_YesNoMode = IROHA_MODE_YesNoMode;
883 static int Vcanna_mode_OnOffMode = IROHA_MODE_OnOffMode;
884 #ifdef CANNA_MODE_AdjustBunsetsuMode
885 static int Vcanna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
887 #ifdef CANNA_MODE_ChikujiYomiMode
888 static int Vcanna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
889 static int Vcanna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
892 static int Vcanna_mode_HenkanMode = IROHA_MODE_HenkanMode;
893 #ifdef CANNA_MODE_HenkanNyuryokuMode
894 static int Vcanna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
896 #ifdef CANNA_MODE_ZenHiraHenkanMode
897 static int Vcanna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
898 #ifdef CANNA_MODE_HanHiraHenkanMode
899 static int Vcanna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
901 static int Vcanna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
902 static int Vcanna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
903 static int Vcanna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
904 static int Vcanna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
906 static int Vcanna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
907 #ifdef CANNA_MODE_HanHiraKakuteiMode
908 static int Vcanna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
910 static int Vcanna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
911 static int Vcanna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
912 static int Vcanna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
913 static int Vcanna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
914 static int Vcanna_mode_HexMode = IROHA_MODE_HexMode;
915 static int Vcanna_mode_BushuMode = IROHA_MODE_BushuMode;
916 static int Vcanna_mode_ExtendMode = IROHA_MODE_ExtendMode;
917 static int Vcanna_mode_RussianMode = IROHA_MODE_RussianMode;
918 static int Vcanna_mode_GreekMode = IROHA_MODE_GreekMode;
919 static int Vcanna_mode_LineMode = IROHA_MODE_LineMode;
920 static int Vcanna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
921 static int Vcanna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
922 static int Vcanna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
923 static int Vcanna_mode_TourokuMode = IROHA_MODE_TourokuMode;
924 static int Vcanna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
925 static int Vcanna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
926 static int Vcanna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
927 static int Vcanna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
928 static int Vcanna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
929 static int Vcanna_mode_MountDicMode = IROHA_MODE_MountDicMode;
931 static int Vcanna_fn_SelfInsert = IROHA_FN_SelfInsert;
932 static int Vcanna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
933 static int Vcanna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
934 static int Vcanna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
935 static int Vcanna_fn_AlphaMode = IROHA_FN_AlphaMode;
936 static int Vcanna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
937 static int Vcanna_fn_Forward = IROHA_FN_Forward;
938 static int Vcanna_fn_Backward = IROHA_FN_Backward;
939 static int Vcanna_fn_Next = IROHA_FN_Next;
940 static int Vcanna_fn_Prev = IROHA_FN_Prev;
941 static int Vcanna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
942 static int Vcanna_fn_EndOfLine = IROHA_FN_EndOfLine;
943 static int Vcanna_fn_DeleteNext = IROHA_FN_DeleteNext;
944 static int Vcanna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
945 static int Vcanna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
946 static int Vcanna_fn_Henkan = IROHA_FN_Henkan;
947 static int Vcanna_fn_Kakutei = IROHA_FN_Kakutei;
948 static int Vcanna_fn_Extend = IROHA_FN_Extend;
949 static int Vcanna_fn_Shrink = IROHA_FN_Shrink;
950 #ifdef CANNA_FN_AdjustBunsetsu
951 static int Vcanna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
953 static int Vcanna_fn_Quit = IROHA_FN_Quit;
954 static int Vcanna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
955 static int Vcanna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
956 static int Vcanna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
957 static int Vcanna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
958 static int Vcanna_fn_Zenkaku = IROHA_FN_Zenkaku;
959 static int Vcanna_fn_Hankaku = IROHA_FN_Hankaku;
960 static int Vcanna_fn_ToUpper = IROHA_FN_ToUpper;
961 static int Vcanna_fn_Capitalize = IROHA_FN_Capitalize;
962 static int Vcanna_fn_ToLower = IROHA_FN_ToLower;
963 static int Vcanna_fn_Hiragana = IROHA_FN_Hiragana;
964 static int Vcanna_fn_Katakana = IROHA_FN_Katakana;
965 static int Vcanna_fn_Romaji = IROHA_FN_Romaji;
966 #ifdef CANNA_FN_BaseHiragana
967 static int Vcanna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
968 static int Vcanna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
969 static int Vcanna_fn_BaseEisu = CANNA_FN_BaseEisu;
970 static int Vcanna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
971 static int Vcanna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
972 static int Vcanna_fn_BaseKana = CANNA_FN_BaseKana;
973 static int Vcanna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
974 static int Vcanna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
975 static int Vcanna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
976 static int Vcanna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
977 static int Vcanna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
978 static int Vcanna_fn_BaseKakuteiHenkanToggle =
979 CANNA_FN_BaseKakuteiHenkanToggle;
980 static int Vcanna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
981 static int Vcanna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
983 static int Vcanna_fn_ExtendMode = IROHA_FN_ExtendMode;
984 static int Vcanna_fn_Touroku = IROHA_FN_Touroku;
985 static int Vcanna_fn_HexMode = IROHA_FN_HexMode;
986 static int Vcanna_fn_BushuMode = IROHA_FN_BushuMode;
987 static int Vcanna_fn_KigouMode = IROHA_FN_KigouMode;
989 static int Vcanna_fn_Mark = CANNA_FN_Mark;
991 #ifdef CANNA_FN_TemporalMode
992 static int Vcanna_fn_TemporalMode = CANNA_FN_TemporalMode;
995 static int Vcanna_key_Nfer = IROHA_KEY_Nfer;
996 static int Vcanna_key_Xfer = IROHA_KEY_Xfer;
997 static int Vcanna_key_Up = IROHA_KEY_Up;
998 static int Vcanna_key_Left = IROHA_KEY_Left;
999 static int Vcanna_key_Right = IROHA_KEY_Right;
1000 static int Vcanna_key_Down = IROHA_KEY_Down;
1001 static int Vcanna_key_Insert = IROHA_KEY_Insert;
1002 static int Vcanna_key_Rollup = IROHA_KEY_Rollup;
1003 static int Vcanna_key_Rolldown = IROHA_KEY_Rolldown;
1004 static int Vcanna_key_Home = IROHA_KEY_Home;
1005 static int Vcanna_key_Help = IROHA_KEY_Help;
1006 static int Vcanna_key_KP_Key = IROHA_KEY_KP_Key;
1007 static int Vcanna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
1008 static int Vcanna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
1009 static int Vcanna_key_Shift_Up = IROHA_KEY_Shift_Up;
1010 static int Vcanna_key_Shift_Left = IROHA_KEY_Shift_Left;
1011 static int Vcanna_key_Shift_Right = IROHA_KEY_Shift_Right;
1012 static int Vcanna_key_Shift_Down = IROHA_KEY_Shift_Down;
1013 static int Vcanna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
1014 static int Vcanna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
1015 static int Vcanna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
1016 static int Vcanna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
1017 static int Vcanna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
1018 static int Vcanna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
1020 Lisp_Object VCANNA; /* by MORIOKA Tomohiko <morioka@jaist.ac.jp>
1024 syms_of_mule_canna (void)
1026 DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
1027 VCANNA = Qt; /* hir@nec, 1992.5.21 */
1029 DEFSUBR (Fcanna_key_proc);
1030 DEFSUBR (Fcanna_initialize);
1031 DEFSUBR (Fcanna_finalize);
1032 DEFSUBR (Fcanna_touroku_string);
1033 DEFSUBR (Fcanna_set_width);
1034 DEFSUBR (Fcanna_change_mode);
1035 DEFSUBR (Fcanna_store_yomi);
1036 DEFSUBR (Fcanna_do_function);
1037 DEFSUBR (Fcanna_parse);
1038 DEFSUBR (Fcanna_query_mode);
1039 DEFSUBR (Fcanna_set_bunsetsu);
1041 DEFSUBR (Fcanna_henkan_begin);
1042 DEFSUBR (Fcanna_henkan_next);
1043 DEFSUBR (Fcanna_bunsetu_henkou);
1044 DEFSUBR (Fcanna_henkan_kakutei);
1045 DEFSUBR (Fcanna_henkan_end);
1046 DEFSUBR (Fcanna_henkan_quit);
1050 vars_of_mule_canna (void)
1052 DEFVAR_LISP ("canna-kakutei-string", &Vcanna_kakutei_string /*
1055 DEFVAR_LISP ("canna-kakutei-yomi", &Vcanna_kakutei_yomi /*
1058 DEFVAR_LISP ("canna-kakutei-romaji", &Vcanna_kakutei_romaji /*
1061 DEFVAR_LISP ("canna-henkan-string", &Vcanna_henkan_string /*
1064 DEFVAR_INT ("canna-henkan-length", &Vcanna_henkan_length /*
1067 DEFVAR_INT ("canna-henkan-revpos", &Vcanna_henkan_revPos /*
1070 DEFVAR_INT ("canna-henkan-revlen", &Vcanna_henkan_revLen /*
1073 DEFVAR_LISP ("canna-ichiran-string", &Vcanna_ichiran_string /*
1076 DEFVAR_INT ("canna-ichiran-length", &Vcanna_ichiran_length /*
1079 DEFVAR_INT ("canna-ichiran-revpos", &Vcanna_ichiran_revPos /*
1082 DEFVAR_INT ("canna-ichiran-revlen", &Vcanna_ichiran_revLen /*
1085 DEFVAR_LISP ("canna-mode-string", &Vcanna_mode_string /*
1089 DEFVAR_BOOL ("canna-empty-info", &Vcanna_empty_info /*
1092 DEFVAR_BOOL ("canna-through-info", &Vcanna_through_info /*
1095 DEFVAR_BOOL ("canna-underline", &Vcanna_underline /*
1098 DEFVAR_BOOL ("canna-inhibit-hankakukana", &Vcanna_inhibit_hankakukana /*
1102 DEFVAR_INT ("canna-mode-alpha-mode", &Vcanna_mode_AlphaMode /*
1105 DEFVAR_INT ("canna-mode-empty-mode", &Vcanna_mode_EmptyMode /*
1108 DEFVAR_INT ("canna-mode-kigo-mode", &Vcanna_mode_KigoMode /*
1111 DEFVAR_INT ("canna-mode-yomi-mode", &Vcanna_mode_YomiMode /*
1114 DEFVAR_INT ("canna-mode-jishu-mode", &Vcanna_mode_JishuMode /*
1117 DEFVAR_INT ("canna-mode-tankouho-mode", &Vcanna_mode_TankouhoMode /*
1120 DEFVAR_INT ("canna-mode-ichiran-mode", &Vcanna_mode_IchiranMode /*
1123 DEFVAR_INT ("canna-mode-yes-no-mode", &Vcanna_mode_YesNoMode /*
1126 DEFVAR_INT ("canna-mode-on-off-mode", &Vcanna_mode_OnOffMode /*
1129 #ifdef CANNA_MODE_AdjustBunsetsuMode
1130 DEFVAR_INT ("canna-mode-adjust-bunsetsu-mode",
1131 &Vcanna_mode_AdjustBunsetsuMode /*
1135 #ifdef CANNA_MODE_ChikujiYomiMode
1136 DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &Vcanna_mode_ChikujiYomiMode /*
1139 DEFVAR_INT ("canna-mode-chikuji-bunsetsu-mode",
1140 &Vcanna_mode_ChikujiTanMode /*
1145 DEFVAR_INT ("canna-mode-henkan-mode", &Vcanna_mode_HenkanMode /*
1148 #ifdef CANNA_MODE_HenkanNyuryokuMode
1149 DEFVAR_INT ("canna-mode-henkan-nyuuryoku-mode",
1150 &Vcanna_mode_HenkanNyuryokuMode /*
1154 #ifdef CANNA_MODE_ZenHiraHenkanMode
1155 DEFVAR_INT ("canna-mode-zen-hira-henkan-mode",
1156 &Vcanna_mode_ZenHiraHenkanMode /*
1159 #ifdef CANNA_MODE_HanHiraHenkanMode
1160 DEFVAR_INT ("canna-mode-han-hira-henkan-mode",
1161 &Vcanna_mode_HanHiraHenkanMode /*
1165 DEFVAR_INT ("canna-mode-zen-kata-henkan-mode",
1166 &Vcanna_mode_ZenKataHenkanMode /*
1169 DEFVAR_INT ("canna-mode-han-kata-henkan-mode",
1170 &Vcanna_mode_HanKataHenkanMode /*
1173 DEFVAR_INT ("canna-mode-zen-alpha-henkan-mode",
1174 &Vcanna_mode_ZenAlphaHenkanMode /*
1177 DEFVAR_INT ("canna-mode-han-alpha-henkan-mode",
1178 &Vcanna_mode_HanAlphaHenkanMode /*
1182 DEFVAR_INT ("canna-mode-zen-hira-kakutei-mode",
1183 &Vcanna_mode_ZenHiraKakuteiMode /*
1186 #ifdef CANNA_MODE_HanHiraKakuteiMode
1187 DEFVAR_INT ("canna-mode-han-hira-kakutei-mode",
1188 &Vcanna_mode_HanHiraKakuteiMode /*
1192 DEFVAR_INT ("canna-mode-zen-kata-kakutei-mode",
1193 &Vcanna_mode_ZenKataKakuteiMode /*
1196 DEFVAR_INT ("canna-mode-han-kata-kakutei-mode",
1197 &Vcanna_mode_HanKataKakuteiMode /*
1200 DEFVAR_INT ("canna-mode-zen-alpha-kakutei-mode",
1201 &Vcanna_mode_ZenAlphaKakuteiMode /*
1204 DEFVAR_INT ("canna-mode-han-alpha-kakutei-mode",
1205 &Vcanna_mode_HanAlphaKakuteiMode /*
1208 DEFVAR_INT ("canna-mode-hex-mode", &Vcanna_mode_HexMode /*
1211 DEFVAR_INT ("canna-mode-bushu-mode", &Vcanna_mode_BushuMode /*
1214 DEFVAR_INT ("canna-mode-extend-mode", &Vcanna_mode_ExtendMode /*
1217 DEFVAR_INT ("canna-mode-russian-mode", &Vcanna_mode_RussianMode /*
1220 DEFVAR_INT ("canna-mode-greek-mode", &Vcanna_mode_GreekMode /*
1223 DEFVAR_INT ("canna-mode-line-mode", &Vcanna_mode_LineMode /*
1226 DEFVAR_INT ("canna-mode-changing-server-mode",
1227 &Vcanna_mode_ChangingServerMode /*
1230 DEFVAR_INT ("canna-mode-henkan-method-mode",
1231 &Vcanna_mode_HenkanMethodMode /*
1234 DEFVAR_INT ("canna-mode-delete-dic-mode", &Vcanna_mode_DeleteDicMode /*
1237 DEFVAR_INT ("canna-mode-touroku-mode", &Vcanna_mode_TourokuMode /*
1240 DEFVAR_INT ("canna-mode-touroku-empty-mode",
1241 &Vcanna_mode_TourokuEmptyMode /*
1244 DEFVAR_INT ("canna-mode-touroku-hinshi-mode",
1245 &Vcanna_mode_TourokuHinshiMode /*
1248 DEFVAR_INT ("canna-mode-touroku-dic-mode", &Vcanna_mode_TourokuDicMode /*
1251 DEFVAR_INT ("canna-mode-quoted-insert-mode",
1252 &Vcanna_mode_QuotedInsertMode /*
1255 DEFVAR_INT ("canna-mode-bubun-muhenkan-mode",
1256 &Vcanna_mode_BubunMuhenkanMode /*
1259 DEFVAR_INT ("canna-mode-mount-dic-mode", &Vcanna_mode_MountDicMode /*
1263 DEFVAR_INT ("canna-func-self-insert", &Vcanna_fn_SelfInsert /*
1266 DEFVAR_INT ("canna-func-functional-insert", &Vcanna_fn_FunctionalInsert /*
1269 DEFVAR_INT ("canna-func-quoted-insert", &Vcanna_fn_QuotedInsert /*
1272 DEFVAR_INT ("canna-func-japanese-mode", &Vcanna_fn_JapaneseMode /*
1275 DEFVAR_INT ("canna-func-alpha-mode", &Vcanna_fn_AlphaMode /*
1278 DEFVAR_INT ("canna-func-henkan-nyuryoku-mode",
1279 &Vcanna_fn_HenkanNyuryokuMode /*
1282 DEFVAR_INT ("canna-func-forward", &Vcanna_fn_Forward /*
1285 DEFVAR_INT ("canna-func-backward", &Vcanna_fn_Backward /*
1288 DEFVAR_INT ("canna-func-next", &Vcanna_fn_Next /*
1291 DEFVAR_INT ("canna-func-previous", &Vcanna_fn_Prev /*
1294 DEFVAR_INT ("canna-func-beginning-of-line", &Vcanna_fn_BeginningOfLine /*
1297 DEFVAR_INT ("canna-func-end-of-line", &Vcanna_fn_EndOfLine /*
1300 DEFVAR_INT ("canna-func-delete-next", &Vcanna_fn_DeleteNext /*
1303 DEFVAR_INT ("canna-func-delete_previous", &Vcanna_fn_DeletePrevious /*
1306 DEFVAR_INT ("canna-func-kill-to-end-of-line", &Vcanna_fn_KillToEndOfLine /*
1309 DEFVAR_INT ("canna-func-henkan", &Vcanna_fn_Henkan /*
1312 DEFVAR_INT ("canna-func-kakutei", &Vcanna_fn_Kakutei /*
1315 DEFVAR_INT ("canna-func-extend", &Vcanna_fn_Extend /*
1318 DEFVAR_INT ("canna-func-shrink", &Vcanna_fn_Shrink /*
1321 #ifdef CANNA_FN_AdjustBunsetsu
1322 DEFVAR_INT ("canna-func-adjust-bunsetsu", &Vcanna_fn_AdjustBunsetsu /*
1326 DEFVAR_INT ("canna-func-quit", &Vcanna_fn_Quit /*
1329 DEFVAR_INT ("canna-func-convert-as-hex", &Vcanna_fn_ConvertAsHex /*
1332 DEFVAR_INT ("canna-func-convert-as-bushu", &Vcanna_fn_ConvertAsBushu /*
1335 DEFVAR_INT ("canna-func-kouho-ichiran", &Vcanna_fn_KouhoIchiran /*
1338 DEFVAR_INT ("canna-func-bubun-muhenkan", &Vcanna_fn_BubunMuhenkan /*
1341 DEFVAR_INT ("canna-func-zenkaku", &Vcanna_fn_Zenkaku /*
1344 DEFVAR_INT ("canna-func-hankaku", &Vcanna_fn_Hankaku /*
1347 DEFVAR_INT ("canna-func-to-upper", &Vcanna_fn_ToUpper /*
1350 DEFVAR_INT ("canna-func-capitalize", &Vcanna_fn_Capitalize /*
1353 DEFVAR_INT ("canna-func-to-lower", &Vcanna_fn_ToLower /*
1356 DEFVAR_INT ("canna-func-hiragana", &Vcanna_fn_Hiragana /*
1359 DEFVAR_INT ("canna-func-katakana", &Vcanna_fn_Katakana /*
1362 DEFVAR_INT ("canna-func-romaji", &Vcanna_fn_Romaji /*
1365 #ifdef CANNA_FN_BaseHiragana
1366 DEFVAR_INT ("canna-func-base-hiragana", &Vcanna_fn_BaseHiragana /*
1369 DEFVAR_INT ("canna-func-base-katakana", &Vcanna_fn_BaseKatakana /*
1372 DEFVAR_INT ("canna-func-base-eisu", &Vcanna_fn_BaseEisu /*
1375 DEFVAR_INT ("canna-func-base-zenkaku", &Vcanna_fn_BaseZenkaku /*
1378 DEFVAR_INT ("canna-func-base-hankaku", &Vcanna_fn_BaseHankaku /*
1381 DEFVAR_INT ("canna-func-base-kana", &Vcanna_fn_BaseKana /*
1384 DEFVAR_INT ("canna-func-base-kakutei", &Vcanna_fn_BaseKakutei /*
1387 DEFVAR_INT ("canna-func-base-henkan", &Vcanna_fn_BaseHenkan /*
1390 DEFVAR_INT ("canna-func-base-hiragana-katakana-toggle",
1391 &Vcanna_fn_BaseHiraKataToggle /*
1394 DEFVAR_INT ("canna-func-base-zenkaku-hankaku-toggle",
1395 &Vcanna_fn_BaseZenHanToggle /*
1398 DEFVAR_INT ("canna-func-base-kana-eisu-toggle",
1399 &Vcanna_fn_BaseKanaEisuToggle /*
1402 DEFVAR_INT ("canna-func-base-kakutei-henkan-toggle",
1403 &Vcanna_fn_BaseKakuteiHenkanToggle /*
1406 DEFVAR_INT ("canna-func-base-rotate-forward",
1407 &Vcanna_fn_BaseRotateForward /*
1410 DEFVAR_INT ("canna-func-base-rotate-backward",
1411 &Vcanna_fn_BaseRotateBackward /*
1415 DEFVAR_INT ("canna-func-extend-mode", &Vcanna_fn_ExtendMode /*
1418 DEFVAR_INT ("canna-func-touroku", &Vcanna_fn_Touroku /*
1421 DEFVAR_INT ("canna-func-hex-mode", &Vcanna_fn_HexMode /*
1424 DEFVAR_INT ("canna-func-bushu-mode", &Vcanna_fn_BushuMode /*
1427 DEFVAR_INT ("canna-func-kigo-mode", &Vcanna_fn_KigouMode /*
1430 #ifdef CANNA_FN_Mark
1431 DEFVAR_INT ("canna-func-mark", &Vcanna_fn_Mark /*
1435 #ifdef CANNA_FN_TemporalMode
1436 DEFVAR_INT ("canna-func-temporal-mode", &Vcanna_fn_TemporalMode /*
1441 DEFVAR_INT ("canna-key-nfer", &Vcanna_key_Nfer /*
1444 DEFVAR_INT ("canna-key-xfer", &Vcanna_key_Xfer /*
1447 DEFVAR_INT ("canna-key-up", &Vcanna_key_Up /*
1450 DEFVAR_INT ("canna-key-left", &Vcanna_key_Left /*
1453 DEFVAR_INT ("canna-key-right", &Vcanna_key_Right /*
1456 DEFVAR_INT ("canna-key-down", &Vcanna_key_Down /*
1459 DEFVAR_INT ("canna-key-insert", &Vcanna_key_Insert /*
1462 DEFVAR_INT ("canna-key-rollup", &Vcanna_key_Rollup /*
1465 DEFVAR_INT ("canna-key-rolldown", &Vcanna_key_Rolldown /*
1468 DEFVAR_INT ("canna-key-home", &Vcanna_key_Home /*
1471 DEFVAR_INT ("canna-key-help", &Vcanna_key_Help /*
1474 DEFVAR_INT ("canna-key-kp-key", &Vcanna_key_KP_Key /*
1477 DEFVAR_INT ("canna-key-shift-nfer", &Vcanna_key_Shift_Nfer /*
1480 DEFVAR_INT ("canna-key-shift-xfer", &Vcanna_key_Shift_Xfer /*
1483 DEFVAR_INT ("canna-key-shift-up", &Vcanna_key_Shift_Up /*
1486 DEFVAR_INT ("canna-key-shift-left", &Vcanna_key_Shift_Left /*
1489 DEFVAR_INT ("canna-key-shift-right", &Vcanna_key_Shift_Right /*
1492 DEFVAR_INT ("canna-key-shift-down", &Vcanna_key_Shift_Down /*
1495 DEFVAR_INT ("canna-key-control-nfer", &Vcanna_key_Cntrl_Nfer /*
1498 DEFVAR_INT ("canna-key-control-xfer", &Vcanna_key_Cntrl_Xfer /*
1501 DEFVAR_INT ("canna-key-control-up", &Vcanna_key_Cntrl_Up /*
1504 DEFVAR_INT ("canna-key-control-left", &Vcanna_key_Cntrl_Left /*
1507 DEFVAR_INT ("canna-key-control-right", &Vcanna_key_Cntrl_Right /*
1510 DEFVAR_INT ("canna-key-control-down", &Vcanna_key_Cntrl_Down /*
1514 Fprovide(intern("CANNA"));
1518 /* To handle MULE internal code and EUC.
1519 I assume CANNA can handle only Japanese EUC. */
1521 /* EUC multibyte string to MULE internal string */
1524 c2mu (char *cp, int l, char *mp)
1526 char ch, *ep = cp+l;
1528 while ((cp < ep) && (ch = *cp))
1530 if ((unsigned char) ch == ISO_CODE_SS2)
1532 *mp++ = LEADING_BYTE_KATAKANA_JISX0201;
1535 else if ((unsigned char) ch == ISO_CODE_SS3)
1537 *mp++ = LEADING_BYTE_JAPANESE_JISX0212;
1543 *mp++ = LEADING_BYTE_JAPANESE_JISX0208;
1551 /* MULE internal string to EUC multibyte string */
1554 m2c (unsigned char *mp, int l, unsigned char *cp)
1556 unsigned char ch, *ep = mp + l;;
1558 while ((mp < ep) && (ch = *mp++))
1562 case LEADING_BYTE_KATAKANA_JISX0201:
1563 *cp++ = ISO_CODE_SS2;
1566 case LEADING_BYTE_JAPANESE_JISX0212:
1567 *cp++ = ISO_CODE_SS3;
1568 case LEADING_BYTE_JAPANESE_JISX0208:
1582 /* make_string after converting EUC string to MULE internal string */
1584 mule_make_string (unsigned char *p, int l)
1586 unsigned char cbuf[4096];
1589 return (make_string (cbuf,strlen (cbuf)));
1592 /* return the MULE internal string length of EUC string */
1593 /* Modified by sb to return a character count not byte count. */
1595 mule_strlen (unsigned char *p, int l)
1597 unsigned char ch, *cp = p;
1600 while ((cp < p + l) && (ch = *cp))
1602 if ((unsigned char) ch == ISO_CODE_SS2)
1607 else if ((unsigned char) ch == ISO_CODE_SS3)
1626 /* count number of characters */
1628 count_char (unsigned char *p, int len, int pos, int rev, int *clen, int *cpos,
1631 unsigned char *q = p;
1633 *clen = *cpos = *crev = 0;
1634 if (len == 0) return;
1639 if (*q++ & 0x80) q++;
1641 while (q < p + pos + rev)
1645 if (*q++ & 0x80) q++;
1650 if (*q++ & 0x80) q++;
1653 #endif /* CANNA_MULE */