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 canna_empty_info, canna_through_info;
173 static int canna_underline;
174 static int canna_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 canna_henkan_length;
181 static int canna_henkan_revPos;
182 static int canna_henkan_revLen;
183 static Lisp_Object Vcanna_ichiran_string;
184 static int canna_ichiran_length;
185 static int canna_ichiran_revPos;
186 static int canna_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 canna_henkan_length = ks->length;
263 canna_henkan_revPos = ks->revPos;
264 canna_henkan_revLen = ks->revLen;
265 #else /* CANNA_MULE */
268 canna_henkan_length = mule_strlen (ks->echoStr,ks->length);
269 canna_henkan_revPos = mule_strlen (ks->echoStr,ks->revPos);
270 canna_henkan_revLen = mule_strlen (ks->echoStr+ks->revPos,ks->revLen);
274 count_char (ks->echoStr, ks->length, ks->revPos, ks->revLen,
275 &canna_henkan_length, &canna_henkan_revPos,
276 &canna_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 canna_ichiran_length = ks->gline.length;
288 canna_ichiran_revPos = ks->gline.revPos;
289 canna_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, &canna_ichiran_length,
293 &canna_ichiran_revPos, &canna_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 canna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
306 canna_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_DATA (server), XSTRING_LENGTH (server));
376 servername[XSTRING_LENGTH (server)] = '\0';
377 jrKanjiControl (0, KC_SETSERVERNAME, servername);
382 jrKanjiControl (0, KC_SETINITFILENAME, (char *) 0);
388 CHECK_STRING (rcfile);
389 strncpy (rcname, XSTRING_DATA (rcfile), XSTRING_LENGTH (rcfile));
390 rcname[XSTRING_LENGTH (rcfile)] = '\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 (canna_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_DATA (str);
494 ks.length = XSTRING_LENGTH (str);
495 #else /* CANNA_MULE */
496 m2c (XSTRING_DATA (str), XSTRING_LENGTH (str), 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_DATA (yomi), XSTRING_LENGTH (yomi));
568 ks.length = XSTRING_LENGTH (yomi);
569 buf[ks.length] = '\0';
570 #else /* CANNA_MULE */
571 m2c (XSTRING_DATA (yomi), XSTRING_LENGTH (yomi), buf);
572 ks.length = strlen (buf);
573 #endif /* CANNA_MULE */
584 strncpy (buf + XSTRING_LENGTH (yomi) + 1, XSTRING_DATA (roma),
585 XSTRING_LENGTH (roma));
586 buf[XSTRING_LENGTH (yomi) + 1 + XSTRING_LENGTH (roma)] = '\0';
587 ks.mode = (unsigned char *)(buf + XSTRING_LENGTH (yomi) + 1);
588 #else /* CANNA_MULE */
589 ks.mode = (unsigned char *)(buf + ks.length + 1);
590 m2c (XSTRING_DATA (roma), XSTRING_LENGTH (roma), 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_DATA (str), XSTRING_LENGTH (str));
647 buf[XSTRING_LENGTH (str)] = '\0';
648 #else /* CANNA_MULE */
649 m2c (XSTRING_DATA (str), XSTRING_LENGTH (str), 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 Return the result of kana-to-kanji conversion.
722 Clause separator is set.
729 if (confirmContext () == 0)
734 strncpy (yomibuf, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi));
735 yomibuf[XSTRING_LENGTH (yomi)] = '\0';
736 nbun = RkBgnBun (IRCP_context, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi),
737 (RK_XFER << RK_XFERBITS) | RK_KFER);
738 #else /* CANNA_MULE */
739 m2c (XSTRING_DATA (yomi), XSTRING_LENGTH (yomi), yomibuf);
740 nbun = RkBgnBun (IRCP_context, (char *) yomibuf, strlen (yomibuf),
741 (RK_XFER << RK_XFERBITS) | RK_KFER);
742 #endif /* CANNA_MULE */
744 return kanjiYomiList (IRCP_context, nbun);
748 kanjiYomiList (int context, int nbun)
750 Lisp_Object val, res = Qnil;
751 unsigned char RkBuf[RKBUFSIZE];
754 for (i = nbun ; i > 0 ; )
758 len = RkGetKanji (context, RkBuf, RKBUFSIZE);
759 val = make_string (RkBuf, len);
760 len = RkGetYomi (context, RkBuf, RKBUFSIZE);
761 res = Fcons (Fcons (val, make_string (RkBuf, len)), res);
762 if (i < RKBUFSIZE / 2)
767 for (i = 0, total = 0 ; i < nbun ; i++)
769 int temp = kugiri[i];
776 DEFUN ("canna-henkan-next", Fcanna_henkan_next, 1, 1, 0, /*
777 Return the list of candidates.
782 unsigned char *p, RkBuf[RKBUFSIZE];
783 Lisp_Object res = Qnil, endp;
785 CHECK_INT (bunsetsu);
786 if (confirmContext () == 0)
790 RkGoTo (IRCP_context, XINT (bunsetsu));
791 len = RkGetKanjiList (IRCP_context, RkBuf, RKBUFSIZE);
793 for (i = 0 ; i < len ; i++)
798 endp = res = Fcons (make_string (p, slen), Qnil);
802 endp = XCDR (res) = Fcons (make_string (p, slen), Qnil);
809 DEFUN ("canna-bunsetu-henkou", Fcanna_bunsetu_henkou, 2, 2, 0, /*
810 Specify the length of a clause.
816 CHECK_INT (bunsetsu);
819 nbun = XINT (bunsetsu);
820 if (confirmContext () == 0)
824 RkGoTo (IRCP_context, nbun);
825 len = byteLen (nbun, XINT (bunlen));
826 return kanjiYomiList (IRCP_context, RkResize (IRCP_context, len));
829 DEFUN ("canna-henkan-kakutei", Fcanna_henkan_kakutei, 2, 2, 0, /*
836 if (confirmContext () == 0)
841 RkGoTo (IRCP_context, nbun);
843 nkouho = XINT(kouho);
844 RkXfer (IRCP_context, nkouho);
848 DEFUN ("canna-henkan-end", Fcanna_henkan_end, 0, 0, 0, /*
853 if (confirmContext () == 0)
857 RkEndBun (IRCP_context, 1); /* ³Ø½¬¤Ï¤¤¤Ä¤Ç¤â¹Ô¤Ã¤ÆÎɤ¤¤â¤Î¤Ê¤Î¤«¡© */
861 DEFUN ("canna-henkan-quit", Fcanna_henkan_quit, 0, 0, 0, /*
866 if (confirmContext () == 0)
870 RkEndBun (IRCP_context, 0);
874 /* variables below this line is constants of Canna */
876 static int canna_mode_AlphaMode;
877 static int canna_mode_EmptyMode;
878 static int canna_mode_KigoMode;
879 static int canna_mode_YomiMode;
880 static int canna_mode_JishuMode;
881 static int canna_mode_TankouhoMode;
882 static int canna_mode_IchiranMode;
883 static int canna_mode_YesNoMode;
884 static int canna_mode_OnOffMode;
885 #ifdef CANNA_MODE_AdjustBunsetsuMode
886 static int canna_mode_AdjustBunsetsuMode;
888 #ifdef CANNA_MODE_ChikujiYomiMode
889 static int canna_mode_ChikujiYomiMode;
890 static int canna_mode_ChikujiTanMode;
893 static int canna_mode_HenkanMode;
894 #ifdef CANNA_MODE_HenkanNyuryokuMode
895 static int canna_mode_HenkanNyuryokuMode;
897 #ifdef CANNA_MODE_ZenHiraHenkanMode
898 static int canna_mode_ZenHiraHenkanMode;
899 #ifdef CANNA_MODE_HanHiraHenkanMode
900 static int canna_mode_HanHiraHenkanMode;
902 static int canna_mode_ZenKataHenkanMode;
903 static int canna_mode_HanKataHenkanMode;
904 static int canna_mode_ZenAlphaHenkanMode;
905 static int canna_mode_HanAlphaHenkanMode;
907 static int canna_mode_ZenHiraKakuteiMode;
908 #ifdef CANNA_MODE_HanHiraKakuteiMode
909 static int canna_mode_HanHiraKakuteiMode;
911 static int canna_mode_ZenKataKakuteiMode;
912 static int canna_mode_HanKataKakuteiMode;
913 static int canna_mode_ZenAlphaKakuteiMode;
914 static int canna_mode_HanAlphaKakuteiMode;
915 static int canna_mode_HexMode;
916 static int canna_mode_BushuMode;
917 static int canna_mode_ExtendMode;
918 static int canna_mode_RussianMode;
919 static int canna_mode_GreekMode;
920 static int canna_mode_LineMode;
921 static int canna_mode_ChangingServerMode;
922 static int canna_mode_HenkanMethodMode;
923 static int canna_mode_DeleteDicMode;
924 static int canna_mode_TourokuMode;
925 static int canna_mode_TourokuEmptyMode;
926 static int canna_mode_TourokuHinshiMode;
927 static int canna_mode_TourokuDicMode;
928 static int canna_mode_QuotedInsertMode;
929 static int canna_mode_BubunMuhenkanMode;
930 static int canna_mode_MountDicMode;
932 static int canna_fn_SelfInsert;
933 static int canna_fn_FunctionalInsert;
934 static int canna_fn_QuotedInsert;
935 static int canna_fn_JapaneseMode;
936 static int canna_fn_AlphaMode;
937 static int canna_fn_HenkanNyuryokuMode;
938 static int canna_fn_Forward;
939 static int canna_fn_Backward;
940 static int canna_fn_Next;
941 static int canna_fn_Prev;
942 static int canna_fn_BeginningOfLine;
943 static int canna_fn_EndOfLine;
944 static int canna_fn_DeleteNext;
945 static int canna_fn_DeletePrevious;
946 static int canna_fn_KillToEndOfLine;
947 static int canna_fn_Henkan;
948 static int canna_fn_Kakutei;
949 static int canna_fn_Extend;
950 static int canna_fn_Shrink;
951 #ifdef CANNA_FN_AdjustBunsetsu
952 static int canna_fn_AdjustBunsetsu;
954 static int canna_fn_Quit;
955 static int canna_fn_ConvertAsHex;
956 static int canna_fn_ConvertAsBushu;
957 static int canna_fn_KouhoIchiran;
958 static int canna_fn_BubunMuhenkan;
959 static int canna_fn_Zenkaku;
960 static int canna_fn_Hankaku;
961 static int canna_fn_ToUpper;
962 static int canna_fn_Capitalize;
963 static int canna_fn_ToLower;
964 static int canna_fn_Hiragana;
965 static int canna_fn_Katakana;
966 static int canna_fn_Romaji;
967 #ifdef CANNA_FN_BaseHiragana
968 static int canna_fn_BaseHiragana;
969 static int canna_fn_BaseKatakana;
970 static int canna_fn_BaseEisu;
971 static int canna_fn_BaseZenkaku;
972 static int canna_fn_BaseHankaku;
973 static int canna_fn_BaseKana;
974 static int canna_fn_BaseKakutei;
975 static int canna_fn_BaseHenkan;
976 static int canna_fn_BaseHiraKataToggle;
977 static int canna_fn_BaseZenHanToggle;
978 static int canna_fn_BaseKanaEisuToggle;
979 static int canna_fn_BaseKakuteiHenkanToggle;
980 static int canna_fn_BaseRotateForward;
981 static int canna_fn_BaseRotateBackward;
983 static int canna_fn_ExtendMode;
984 static int canna_fn_Touroku;
985 static int canna_fn_HexMode;
986 static int canna_fn_BushuMode;
987 static int canna_fn_KigouMode;
989 static int canna_fn_Mark;
991 #ifdef CANNA_FN_TemporalMode
992 static int canna_fn_TemporalMode;
995 static int canna_key_Nfer;
996 static int canna_key_Xfer;
997 static int canna_key_Up;
998 static int canna_key_Left;
999 static int canna_key_Right;
1000 static int canna_key_Down;
1001 static int canna_key_Insert;
1002 static int canna_key_Rollup;
1003 static int canna_key_Rolldown;
1004 static int canna_key_Home;
1005 static int canna_key_Help;
1006 static int canna_key_KP_Key;
1007 static int canna_key_Shift_Nfer;
1008 static int canna_key_Shift_Xfer;
1009 static int canna_key_Shift_Up;
1010 static int canna_key_Shift_Left;
1011 static int canna_key_Shift_Right;
1012 static int canna_key_Shift_Down;
1013 static int canna_key_Cntrl_Nfer;
1014 static int canna_key_Cntrl_Xfer;
1015 static int canna_key_Cntrl_Up;
1016 static int canna_key_Cntrl_Left;
1017 static int canna_key_Cntrl_Right;
1018 static int canna_key_Cntrl_Down;
1020 Lisp_Object VCANNA; /* by MORIOKA Tomohiko <morioka@jaist.ac.jp>
1024 syms_of_mule_canna (void)
1026 DEFSUBR (Fcanna_key_proc);
1027 DEFSUBR (Fcanna_initialize);
1028 DEFSUBR (Fcanna_finalize);
1029 DEFSUBR (Fcanna_touroku_string);
1030 DEFSUBR (Fcanna_set_width);
1031 DEFSUBR (Fcanna_change_mode);
1032 DEFSUBR (Fcanna_store_yomi);
1033 DEFSUBR (Fcanna_do_function);
1034 DEFSUBR (Fcanna_parse);
1035 DEFSUBR (Fcanna_query_mode);
1036 DEFSUBR (Fcanna_set_bunsetsu);
1038 DEFSUBR (Fcanna_henkan_begin);
1039 DEFSUBR (Fcanna_henkan_next);
1040 DEFSUBR (Fcanna_bunsetu_henkou);
1041 DEFSUBR (Fcanna_henkan_kakutei);
1042 DEFSUBR (Fcanna_henkan_end);
1043 DEFSUBR (Fcanna_henkan_quit);
1047 vars_of_mule_canna (void)
1049 DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
1050 VCANNA = Qt; /* hir@nec, 1992.5.21 */
1052 DEFVAR_LISP ("canna-kakutei-string", &Vcanna_kakutei_string /*
1055 Vcanna_kakutei_string = Qnil;
1057 DEFVAR_LISP ("canna-kakutei-yomi", &Vcanna_kakutei_yomi /*
1060 Vcanna_kakutei_yomi = Qnil;
1062 DEFVAR_LISP ("canna-kakutei-romaji", &Vcanna_kakutei_romaji /*
1065 Vcanna_kakutei_romaji = Qnil;
1067 DEFVAR_LISP ("canna-henkan-string", &Vcanna_henkan_string /*
1070 Vcanna_henkan_string = Qnil;
1072 DEFVAR_INT ("canna-henkan-length", &canna_henkan_length /*
1075 canna_henkan_length = 0;
1077 DEFVAR_INT ("canna-henkan-revpos", &canna_henkan_revPos /*
1080 canna_henkan_revPos = 0;
1082 DEFVAR_INT ("canna-henkan-revlen", &canna_henkan_revLen /*
1085 canna_henkan_revLen = 0;
1087 DEFVAR_LISP ("canna-ichiran-string", &Vcanna_ichiran_string /*
1090 Vcanna_ichiran_string = Qnil;
1092 DEFVAR_INT ("canna-ichiran-length", &canna_ichiran_length /*
1095 canna_ichiran_length = 0;
1097 DEFVAR_INT ("canna-ichiran-revpos", &canna_ichiran_revPos /*
1100 canna_ichiran_revPos = 0;
1102 DEFVAR_INT ("canna-ichiran-revlen", &canna_ichiran_revLen /*
1105 canna_ichiran_revLen = 0;
1107 DEFVAR_LISP ("canna-mode-string", &Vcanna_mode_string /*
1110 Vcanna_mode_string = Qnil;
1112 DEFVAR_BOOL ("canna-empty-info", &canna_empty_info /*
1115 canna_empty_info = 0;
1117 DEFVAR_BOOL ("canna-through-info", &canna_through_info /*
1120 canna_through_info = 0;
1122 DEFVAR_BOOL ("canna-underline", &canna_underline /*
1125 canna_underline = 0;
1127 DEFVAR_BOOL ("canna-inhibit-hankakukana", &canna_inhibit_hankakukana /*
1130 canna_inhibit_hankakukana = 0;
1132 DEFVAR_INT ("canna-mode-alpha-mode", &canna_mode_AlphaMode /*
1135 canna_mode_AlphaMode = IROHA_MODE_AlphaMode;
1137 DEFVAR_INT ("canna-mode-empty-mode", &canna_mode_EmptyMode /*
1140 canna_mode_EmptyMode = IROHA_MODE_EmptyMode;
1142 DEFVAR_INT ("canna-mode-kigo-mode", &canna_mode_KigoMode /*
1145 canna_mode_KigoMode = IROHA_MODE_KigoMode;
1147 DEFVAR_INT ("canna-mode-yomi-mode", &canna_mode_YomiMode /*
1150 canna_mode_YomiMode = IROHA_MODE_YomiMode;
1152 DEFVAR_INT ("canna-mode-jishu-mode", &canna_mode_JishuMode /*
1155 canna_mode_JishuMode = IROHA_MODE_JishuMode;
1157 DEFVAR_INT ("canna-mode-tankouho-mode", &canna_mode_TankouhoMode /*
1160 canna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
1162 DEFVAR_INT ("canna-mode-ichiran-mode", &canna_mode_IchiranMode /*
1165 canna_mode_IchiranMode = IROHA_MODE_IchiranMode;
1167 DEFVAR_INT ("canna-mode-yes-no-mode", &canna_mode_YesNoMode /*
1170 canna_mode_YesNoMode = IROHA_MODE_YesNoMode;
1172 DEFVAR_INT ("canna-mode-on-off-mode", &canna_mode_OnOffMode /*
1175 canna_mode_OnOffMode = IROHA_MODE_OnOffMode;
1177 #ifdef CANNA_MODE_AdjustBunsetsuMode
1178 DEFVAR_INT ("canna-mode-adjust-bunsetsu-mode",
1179 &canna_mode_AdjustBunsetsuMode /*
1182 canna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
1184 #ifdef CANNA_MODE_ChikujiYomiMode
1185 DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &canna_mode_ChikujiYomiMode /*
1188 canna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
1190 DEFVAR_INT ("canna-mode-chikuji-bunsetsu-mode",
1191 &canna_mode_ChikujiTanMode /*
1194 canna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
1197 DEFVAR_INT ("canna-mode-henkan-mode", &canna_mode_HenkanMode /*
1200 canna_mode_HenkanMode = IROHA_MODE_HenkanMode;
1202 #ifdef CANNA_MODE_HenkanNyuryokuMode
1203 DEFVAR_INT ("canna-mode-henkan-nyuuryoku-mode",
1204 &canna_mode_HenkanNyuryokuMode /*
1207 canna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
1209 #ifdef CANNA_MODE_ZenHiraHenkanMode
1210 DEFVAR_INT ("canna-mode-zen-hira-henkan-mode",
1211 &canna_mode_ZenHiraHenkanMode /*
1214 canna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
1215 #ifdef CANNA_MODE_HanHiraHenkanMode
1216 DEFVAR_INT ("canna-mode-han-hira-henkan-mode",
1217 &canna_mode_HanHiraHenkanMode /*
1220 canna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
1222 DEFVAR_INT ("canna-mode-zen-kata-henkan-mode",
1223 &canna_mode_ZenKataHenkanMode /*
1226 canna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
1228 DEFVAR_INT ("canna-mode-han-kata-henkan-mode",
1229 &canna_mode_HanKataHenkanMode /*
1232 canna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
1234 DEFVAR_INT ("canna-mode-zen-alpha-henkan-mode",
1235 &canna_mode_ZenAlphaHenkanMode /*
1238 canna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
1240 DEFVAR_INT ("canna-mode-han-alpha-henkan-mode",
1241 &canna_mode_HanAlphaHenkanMode /*
1244 canna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
1246 DEFVAR_INT ("canna-mode-zen-hira-kakutei-mode",
1247 &canna_mode_ZenHiraKakuteiMode /*
1250 canna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
1251 #ifdef CANNA_MODE_HanHiraKakuteiMode
1252 DEFVAR_INT ("canna-mode-han-hira-kakutei-mode",
1253 &canna_mode_HanHiraKakuteiMode /*
1256 canna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
1258 DEFVAR_INT ("canna-mode-zen-kata-kakutei-mode",
1259 &canna_mode_ZenKataKakuteiMode /*
1262 canna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
1264 DEFVAR_INT ("canna-mode-han-kata-kakutei-mode",
1265 &canna_mode_HanKataKakuteiMode /*
1268 canna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
1270 DEFVAR_INT ("canna-mode-zen-alpha-kakutei-mode",
1271 &canna_mode_ZenAlphaKakuteiMode /*
1274 canna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
1276 DEFVAR_INT ("canna-mode-han-alpha-kakutei-mode",
1277 &canna_mode_HanAlphaKakuteiMode /*
1280 canna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
1282 DEFVAR_INT ("canna-mode-hex-mode", &canna_mode_HexMode /*
1285 canna_mode_HexMode = IROHA_MODE_HexMode;
1287 DEFVAR_INT ("canna-mode-bushu-mode", &canna_mode_BushuMode /*
1290 canna_mode_BushuMode = IROHA_MODE_BushuMode;
1292 DEFVAR_INT ("canna-mode-extend-mode", &canna_mode_ExtendMode /*
1295 canna_mode_ExtendMode = IROHA_MODE_ExtendMode;
1297 DEFVAR_INT ("canna-mode-russian-mode", &canna_mode_RussianMode /*
1300 canna_mode_RussianMode = IROHA_MODE_RussianMode;
1302 DEFVAR_INT ("canna-mode-greek-mode", &canna_mode_GreekMode /*
1305 canna_mode_GreekMode = IROHA_MODE_GreekMode;
1307 DEFVAR_INT ("canna-mode-line-mode", &canna_mode_LineMode /*
1310 canna_mode_LineMode = IROHA_MODE_LineMode;
1312 DEFVAR_INT ("canna-mode-changing-server-mode",
1313 &canna_mode_ChangingServerMode /*
1316 canna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
1318 DEFVAR_INT ("canna-mode-henkan-method-mode",
1319 &canna_mode_HenkanMethodMode /*
1322 canna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
1324 DEFVAR_INT ("canna-mode-delete-dic-mode", &canna_mode_DeleteDicMode /*
1327 canna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
1329 DEFVAR_INT ("canna-mode-touroku-mode", &canna_mode_TourokuMode /*
1332 canna_mode_TourokuMode = IROHA_MODE_TourokuMode;
1334 DEFVAR_INT ("canna-mode-touroku-empty-mode",
1335 &canna_mode_TourokuEmptyMode /*
1338 canna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
1340 DEFVAR_INT ("canna-mode-touroku-hinshi-mode",
1341 &canna_mode_TourokuHinshiMode /*
1344 canna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
1346 DEFVAR_INT ("canna-mode-touroku-dic-mode", &canna_mode_TourokuDicMode /*
1349 canna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
1351 DEFVAR_INT ("canna-mode-quoted-insert-mode",
1352 &canna_mode_QuotedInsertMode /*
1355 canna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
1357 DEFVAR_INT ("canna-mode-bubun-muhenkan-mode",
1358 &canna_mode_BubunMuhenkanMode /*
1361 canna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
1363 DEFVAR_INT ("canna-mode-mount-dic-mode", &canna_mode_MountDicMode /*
1366 canna_mode_MountDicMode = IROHA_MODE_MountDicMode;
1368 DEFVAR_INT ("canna-func-self-insert", &canna_fn_SelfInsert /*
1371 canna_fn_SelfInsert = IROHA_FN_SelfInsert;
1373 DEFVAR_INT ("canna-func-functional-insert", &canna_fn_FunctionalInsert /*
1376 canna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
1378 DEFVAR_INT ("canna-func-quoted-insert", &canna_fn_QuotedInsert /*
1381 canna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
1383 DEFVAR_INT ("canna-func-japanese-mode", &canna_fn_JapaneseMode /*
1386 canna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
1388 DEFVAR_INT ("canna-func-alpha-mode", &canna_fn_AlphaMode /*
1391 canna_fn_AlphaMode = IROHA_FN_AlphaMode;
1393 DEFVAR_INT ("canna-func-henkan-nyuryoku-mode",
1394 &canna_fn_HenkanNyuryokuMode /*
1397 canna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
1399 DEFVAR_INT ("canna-func-forward", &canna_fn_Forward /*
1402 canna_fn_Forward = IROHA_FN_Forward;
1404 DEFVAR_INT ("canna-func-backward", &canna_fn_Backward /*
1407 canna_fn_Backward = IROHA_FN_Backward;
1409 DEFVAR_INT ("canna-func-next", &canna_fn_Next /*
1412 canna_fn_Next = IROHA_FN_Next;
1414 DEFVAR_INT ("canna-func-previous", &canna_fn_Prev /*
1417 canna_fn_Prev = IROHA_FN_Prev;
1419 DEFVAR_INT ("canna-func-beginning-of-line", &canna_fn_BeginningOfLine /*
1422 canna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
1424 DEFVAR_INT ("canna-func-end-of-line", &canna_fn_EndOfLine /*
1427 canna_fn_EndOfLine = IROHA_FN_EndOfLine;
1429 DEFVAR_INT ("canna-func-delete-next", &canna_fn_DeleteNext /*
1432 canna_fn_DeleteNext = IROHA_FN_DeleteNext;
1434 DEFVAR_INT ("canna-func-delete_previous", &canna_fn_DeletePrevious /*
1437 canna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
1439 DEFVAR_INT ("canna-func-kill-to-end-of-line", &canna_fn_KillToEndOfLine /*
1442 canna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
1444 DEFVAR_INT ("canna-func-henkan", &canna_fn_Henkan /*
1447 canna_fn_Henkan = IROHA_FN_Henkan;
1449 DEFVAR_INT ("canna-func-kakutei", &canna_fn_Kakutei /*
1452 canna_fn_Kakutei = IROHA_FN_Kakutei;
1454 DEFVAR_INT ("canna-func-extend", &canna_fn_Extend /*
1457 canna_fn_Extend = IROHA_FN_Extend;
1459 DEFVAR_INT ("canna-func-shrink", &canna_fn_Shrink /*
1462 canna_fn_Shrink = IROHA_FN_Shrink;
1464 #ifdef CANNA_FN_AdjustBunsetsu
1465 DEFVAR_INT ("canna-func-adjust-bunsetsu", &canna_fn_AdjustBunsetsu /*
1468 canna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
1470 DEFVAR_INT ("canna-func-quit", &canna_fn_Quit /*
1473 canna_fn_Quit = IROHA_FN_Quit;
1475 DEFVAR_INT ("canna-func-convert-as-hex", &canna_fn_ConvertAsHex /*
1478 canna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
1480 DEFVAR_INT ("canna-func-convert-as-bushu", &canna_fn_ConvertAsBushu /*
1483 canna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
1485 DEFVAR_INT ("canna-func-kouho-ichiran", &canna_fn_KouhoIchiran /*
1488 canna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
1490 DEFVAR_INT ("canna-func-bubun-muhenkan", &canna_fn_BubunMuhenkan /*
1493 canna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
1495 DEFVAR_INT ("canna-func-zenkaku", &canna_fn_Zenkaku /*
1498 canna_fn_Zenkaku = IROHA_FN_Zenkaku;
1500 DEFVAR_INT ("canna-func-hankaku", &canna_fn_Hankaku /*
1503 canna_fn_Hankaku = IROHA_FN_Hankaku;
1505 DEFVAR_INT ("canna-func-to-upper", &canna_fn_ToUpper /*
1508 canna_fn_ToUpper = IROHA_FN_ToUpper;
1510 DEFVAR_INT ("canna-func-capitalize", &canna_fn_Capitalize /*
1513 canna_fn_Capitalize = IROHA_FN_Capitalize;
1515 DEFVAR_INT ("canna-func-to-lower", &canna_fn_ToLower /*
1518 canna_fn_ToLower = IROHA_FN_ToLower;
1520 DEFVAR_INT ("canna-func-hiragana", &canna_fn_Hiragana /*
1523 canna_fn_Hiragana = IROHA_FN_Hiragana;
1525 DEFVAR_INT ("canna-func-katakana", &canna_fn_Katakana /*
1528 canna_fn_Katakana = IROHA_FN_Katakana;
1530 DEFVAR_INT ("canna-func-romaji", &canna_fn_Romaji /*
1533 canna_fn_Romaji = IROHA_FN_Romaji;
1535 #ifdef CANNA_FN_BaseHiragana
1536 DEFVAR_INT ("canna-func-base-hiragana", &canna_fn_BaseHiragana /*
1539 canna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
1541 DEFVAR_INT ("canna-func-base-katakana", &canna_fn_BaseKatakana /*
1544 canna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
1546 DEFVAR_INT ("canna-func-base-eisu", &canna_fn_BaseEisu /*
1549 canna_fn_BaseEisu = CANNA_FN_BaseEisu;
1551 DEFVAR_INT ("canna-func-base-zenkaku", &canna_fn_BaseZenkaku /*
1554 canna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
1556 DEFVAR_INT ("canna-func-base-hankaku", &canna_fn_BaseHankaku /*
1559 canna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
1561 DEFVAR_INT ("canna-func-base-kana", &canna_fn_BaseKana /*
1564 canna_fn_BaseKana = CANNA_FN_BaseKana;
1566 DEFVAR_INT ("canna-func-base-kakutei", &canna_fn_BaseKakutei /*
1569 canna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
1571 DEFVAR_INT ("canna-func-base-henkan", &canna_fn_BaseHenkan /*
1574 canna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
1576 DEFVAR_INT ("canna-func-base-hiragana-katakana-toggle",
1577 &canna_fn_BaseHiraKataToggle /*
1580 canna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
1582 DEFVAR_INT ("canna-func-base-zenkaku-hankaku-toggle",
1583 &canna_fn_BaseZenHanToggle /*
1586 canna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
1588 DEFVAR_INT ("canna-func-base-kana-eisu-toggle",
1589 &canna_fn_BaseKanaEisuToggle /*
1592 canna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
1594 DEFVAR_INT ("canna-func-base-kakutei-henkan-toggle",
1595 &canna_fn_BaseKakuteiHenkanToggle /*
1598 canna_fn_BaseKakuteiHenkanToggle = CANNA_FN_BaseKakuteiHenkanToggle;
1600 DEFVAR_INT ("canna-func-base-rotate-forward",
1601 &canna_fn_BaseRotateForward /*
1604 canna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
1606 DEFVAR_INT ("canna-func-base-rotate-backward",
1607 &canna_fn_BaseRotateBackward /*
1610 canna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
1613 DEFVAR_INT ("canna-func-extend-mode", &canna_fn_ExtendMode /*
1616 canna_fn_ExtendMode = IROHA_FN_ExtendMode;
1618 DEFVAR_INT ("canna-func-touroku", &canna_fn_Touroku /*
1621 canna_fn_Touroku = IROHA_FN_Touroku;
1623 DEFVAR_INT ("canna-func-hex-mode", &canna_fn_HexMode /*
1626 canna_fn_HexMode = IROHA_FN_HexMode;
1628 DEFVAR_INT ("canna-func-bushu-mode", &canna_fn_BushuMode /*
1631 canna_fn_BushuMode = IROHA_FN_BushuMode;
1633 DEFVAR_INT ("canna-func-kigo-mode", &canna_fn_KigouMode /*
1636 canna_fn_KigouMode = IROHA_FN_KigouMode;
1638 #ifdef CANNA_FN_Mark
1639 DEFVAR_INT ("canna-func-mark", &canna_fn_Mark /*
1642 canna_fn_Mark = CANNA_FN_Mark;
1644 #ifdef CANNA_FN_TemporalMode
1645 DEFVAR_INT ("canna-func-temporal-mode", &canna_fn_TemporalMode /*
1648 canna_fn_TemporalMode = CANNA_FN_TemporalMode;
1651 DEFVAR_INT ("canna-key-nfer", &canna_key_Nfer /*
1654 canna_key_Nfer = IROHA_KEY_Nfer;
1656 DEFVAR_INT ("canna-key-xfer", &canna_key_Xfer /*
1659 canna_key_Xfer = IROHA_KEY_Xfer;
1661 DEFVAR_INT ("canna-key-up", &canna_key_Up /*
1664 canna_key_Up = IROHA_KEY_Up;
1666 DEFVAR_INT ("canna-key-left", &canna_key_Left /*
1669 canna_key_Left = IROHA_KEY_Left;
1671 DEFVAR_INT ("canna-key-right", &canna_key_Right /*
1674 canna_key_Right = IROHA_KEY_Right;
1676 DEFVAR_INT ("canna-key-down", &canna_key_Down /*
1679 canna_key_Down = IROHA_KEY_Down;
1681 DEFVAR_INT ("canna-key-insert", &canna_key_Insert /*
1684 canna_key_Insert = IROHA_KEY_Insert;
1686 DEFVAR_INT ("canna-key-rollup", &canna_key_Rollup /*
1689 canna_key_Rollup = IROHA_KEY_Rollup;
1691 DEFVAR_INT ("canna-key-rolldown", &canna_key_Rolldown /*
1694 canna_key_Rolldown = IROHA_KEY_Rolldown;
1696 DEFVAR_INT ("canna-key-home", &canna_key_Home /*
1699 canna_key_Home = IROHA_KEY_Home;
1701 DEFVAR_INT ("canna-key-help", &canna_key_Help /*
1704 canna_key_Help = IROHA_KEY_Help;
1706 DEFVAR_INT ("canna-key-kp-key", &canna_key_KP_Key /*
1709 canna_key_KP_Key = IROHA_KEY_KP_Key;
1711 DEFVAR_INT ("canna-key-shift-nfer", &canna_key_Shift_Nfer /*
1714 canna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
1716 DEFVAR_INT ("canna-key-shift-xfer", &canna_key_Shift_Xfer /*
1719 canna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
1721 DEFVAR_INT ("canna-key-shift-up", &canna_key_Shift_Up /*
1724 canna_key_Shift_Up = IROHA_KEY_Shift_Up;
1726 DEFVAR_INT ("canna-key-shift-left", &canna_key_Shift_Left /*
1729 canna_key_Shift_Left = IROHA_KEY_Shift_Left;
1731 DEFVAR_INT ("canna-key-shift-right", &canna_key_Shift_Right /*
1734 canna_key_Shift_Right = IROHA_KEY_Shift_Right;
1736 DEFVAR_INT ("canna-key-shift-down", &canna_key_Shift_Down /*
1739 canna_key_Shift_Down = IROHA_KEY_Shift_Down;
1741 DEFVAR_INT ("canna-key-control-nfer", &canna_key_Cntrl_Nfer /*
1744 canna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
1746 DEFVAR_INT ("canna-key-control-xfer", &canna_key_Cntrl_Xfer /*
1749 canna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
1751 DEFVAR_INT ("canna-key-control-up", &canna_key_Cntrl_Up /*
1754 canna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
1756 DEFVAR_INT ("canna-key-control-left", &canna_key_Cntrl_Left /*
1759 canna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
1761 DEFVAR_INT ("canna-key-control-right", &canna_key_Cntrl_Right /*
1764 canna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
1766 DEFVAR_INT ("canna-key-control-down", &canna_key_Cntrl_Down /*
1769 canna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
1771 Fprovide(intern("CANNA"));
1775 /* To handle MULE internal code and EUC.
1776 I assume CANNA can handle only Japanese EUC. */
1778 /* EUC multibyte string to MULE internal string */
1781 c2mu (unsigned char *cp, int l, unsigned char *mp)
1783 unsigned char ch, *ep = cp+l;
1787 while ((cp < ep) && (ch = *cp++))
1789 if (ch == ISO_CODE_SS2)
1791 chr = (*cp++) + MIN_CHAR_HALFWIDTH_KATAKANA - 0x20;
1793 else if (ch == ISO_CODE_SS3)
1796 chr = MAKE_CHAR (Vcharset_japanese_jisx0212,
1797 ch & 0x7f, (*cp++) & 0x7f);
1801 chr = MAKE_CHAR (Vcharset_japanese_jisx0208,
1802 ch & 0x7f, (*cp++) & 0x7f);
1812 else if ( chr <= 0x7ff )
1814 *mp++ = (chr >> 6) | 0xc0;
1815 *mp++ = (chr & 0x3f) | 0x80;
1817 else if ( chr <= 0xffff )
1819 *mp++ = (chr >> 12) | 0xe0;
1820 *mp++ = ((chr >> 6) & 0x3f) | 0x80;
1821 *mp++ = (chr & 0x3f) | 0x80;
1823 else if ( chr <= 0x1fffff )
1825 *mp++ = (chr >> 18) | 0xf0;
1826 *mp++ = ((chr >> 12) & 0x3f) | 0x80;
1827 *mp++ = ((chr >> 6) & 0x3f) | 0x80;
1828 *mp++ = (chr & 0x3f) | 0x80;
1830 else if ( chr <= 0x3ffffff )
1832 *mp++ = (chr >> 24) | 0xf8;
1833 *mp++ = ((chr >> 18) & 0x3f) | 0x80;
1834 *mp++ = ((chr >> 12) & 0x3f) | 0x80;
1835 *mp++ = ((chr >> 6) & 0x3f) | 0x80;
1836 *mp++ = (chr & 0x3f) | 0x80;
1840 *mp++ = (chr >> 30) | 0xfc;
1841 *mp++ = ((chr >> 24) & 0x3f) | 0x80;
1842 *mp++ = ((chr >> 18) & 0x3f) | 0x80;
1843 *mp++ = ((chr >> 12) & 0x3f) | 0x80;
1844 *mp++ = ((chr >> 6) & 0x3f) | 0x80;
1845 *mp++ = (chr & 0x3f) | 0x80;
1849 while ((cp < ep) && (ch = *cp))
1851 if ((unsigned char) ch == ISO_CODE_SS2)
1853 *mp++ = LEADING_BYTE_KATAKANA_JISX0201;
1856 else if ((unsigned char) ch == ISO_CODE_SS3)
1858 *mp++ = LEADING_BYTE_JAPANESE_JISX0212;
1864 *mp++ = LEADING_BYTE_JAPANESE_JISX0208;
1873 /* MULE internal string to EUC multibyte string */
1876 m2c (unsigned char *mp, int l, unsigned char *cp)
1878 unsigned char ch, *ep = mp + l;
1885 while ((mp < ep) && (ch = *mp++))
1893 else if ( ch >= 0xf8 )
1898 else if ( ch >= 0xf0 )
1903 else if ( ch >= 0xe0 )
1908 else if ( ch >= 0xc0 )
1918 for( ; len > 0; len-- )
1921 chr = ( chr << 6 ) | ( ch & 0x3f );
1925 else if ( chr <= MAX_CHAR_HALFWIDTH_KATAKANA )
1927 *cp++ = ISO_CODE_SS2;
1928 *cp++ = ( chr & 0x7f ) | 0x80;
1932 Lisp_Object charset;
1935 BREAKUP_CHAR (chr, charset, c1, c2);
1936 fb = XCHARSET_FINAL (charset);
1940 *cp++ = ISO_CODE_SS3;
1949 case LEADING_BYTE_KATAKANA_JISX0201:
1950 *cp++ = ISO_CODE_SS2;
1953 case LEADING_BYTE_JAPANESE_JISX0212:
1954 *cp++ = ISO_CODE_SS3;
1955 case LEADING_BYTE_JAPANESE_JISX0208:
1970 /* make_string after converting EUC string to MULE internal string */
1972 mule_make_string (unsigned char *p, int l)
1974 unsigned char cbuf[4096];
1977 return (make_string (cbuf,strlen (cbuf)));
1980 /* return the MULE internal string length of EUC string */
1981 /* Modified by sb to return a character count not byte count. */
1983 mule_strlen (unsigned char *p, int l)
1985 unsigned char ch, *cp = p;
1988 while ((cp < p + l) && (ch = *cp))
1990 if ((unsigned char) ch == ISO_CODE_SS2)
1995 else if ((unsigned char) ch == ISO_CODE_SS3)
2014 /* count number of characters */
2016 count_char (unsigned char *p, int len, int pos, int rev, int *clen, int *cpos,
2019 unsigned char *q = p;
2021 *clen = *cpos = *crev = 0;
2022 if (len == 0) return;
2027 if (*q++ & 0x80) q++;
2029 while (q < p + pos + rev)
2033 if (*q++ & 0x80) q++;
2038 if (*q++ & 0x80) q++;
2041 #endif /* CANNA_MULE */