1 /* -*- coding: iso-2022-jp -*-
2 Copyright (C) 1995 Free Software Foundation, Inc.
3 Copyright (C) 1995 Sun Microsystems, Inc.
5 This file is part of SXEmacs
7 SXEmacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 SXEmacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 /* Synched up with: Mule 2.3. Not in FSF. */
23 /* Jserver Interface for Mule
24 Coded by Yutaka Ishikawa at ETL (yisikawa@etl.go.jp)
25 Satoru Tomura at ETL (tomura@etl.go.jp)
26 Modified for Wnn4 library by
27 Toshiaki Shingu (shingu@cpr.canon.co.jp)
28 Hiroshi Kuribayashi (kuri@nff.ncl.omron.co.jp) */
31 * Functions defined in this file are
32 * (wnn-server-open wnn-host-name login-name)
33 * wnn-host-name: STRING or NIL
37 * jserver
\e$B$H@\B3$7!"%5!<%P!<FbIt$K@5JQ49!?5UJQ49#2$D$N4D6-$r
\e(B
38 *
\e$B:n$k!#%(%i!<$N;~$O
\e(B nil
\e$B$rJV$9!#
\e(B
43 * jserver
\e$B$H$N@\B3$r@Z$k!#<-=q!"IQEY$O%;!<%V$5$l$J$$!#
\e(B
45 * (wnn-server-dict-add dict-file-name hindo-file-name priority
46 * dict-file-mode hindo-file-mode pw1 pw2)
47 * dict-file-name: STRING
48 * hindo-file-name: STRING or NULL-STRING
50 * dict-file-mode: BOOLEAN
51 * hindo-file-mode: BOOLEAN
55 *
\e$B<-=q%U%!%$%kL>!"IQEY%U%!%$%kL>!"M%@hEY!"<-=q%U%!%$%k%b!<%I
\e(B
56 *
\e$BIQEY%U%!%$%k%b!<%I$G;XDj$7$?<-=q$r%P%C%U%!$KDI2C$9$k!#
\e(B
57 * pw1, pw2
\e$B$O<-=q%U%!%$%k!"IQEY%U%!%$%k$N%Q%9%o!<%I!#
\e(B
59 * (wnn-server-dict-delete dic-no)
61 * RETURNS:
\e$B%(%i!<$N;~
\e(B nil
62 * DESCRIPTION: dic-no
\e$B$N<-=qHV9f$N<-=q$r!"%P%C%U%!$+$i
\e(B
65 * (wnn-server-dict-list)
66 * RETURNS: ((dic-no1 file-name1 comment1 word-no1 nice1)
67 * (dic-no2 file-name2 comment2 word-no2 nice2)...)
68 * DESCRIPTION:
\e$B%P%C%U%!>e$N<-=q$N%j%9%H$rF@$k!#
\e(B
70 * (wnn-server-dict-comment dic-no comment)
71 * RETURNS:
\e$B%(%i!<$N;~
\e(B nil
72 * DESCRIPTION: dic-no
\e$B$N<-=q$K%3%a%s%H$r$D$1$k!#
\e(B
74 * (wnn-server-set-rev rev)
76 * rev
\e$B$,
\e(B nil
\e$B$N;~$O@5JQ49!"$=$l0J30$N;~$O5UJQ49
\e(B
78 * (wnn-server-henkan-begin henkan-string)
79 * henkan-string: STRING
80 * RETURNS: bunsetu-suu
82 *
\e$B2>L>4A;zJQ49$r$7!"Bh0l8uJd$NJ8@a?t$rJV$9!#
\e(B
84 * (wnn-server-zenkouho bunsetu-no dai)
89 *
\e$BJ8@aHV9f$G;XDj$5$l$?J8@a$NA48uJd$r$H$j$@$7
\e(B
90 *
\e$B!"8=:_$N%*%U%;%C%H$rJV$9!#
\e(B
92 * (wnn-server-get-zenkouho offset)
95 * RETURNS: list of zenkouho
97 *
\e$B%*%U%;%C%H$G;XDj$5$l$?8uJd$rF@$k!#
\e(B
99 * (wnn-server-zenkouho-bun)
102 *
\e$BA48uJd$rI=<($7$F$$$kJ8@aHV9f$rF@$k!#
\e(B
104 * (wnn-server-zenkouho-suu)
107 *
\e$BA48uJd$rI=<($7$F$$$kJ8@a$NA48uJd?t$rF@$k!#
\e(B
109 * (wnn-server-dai-top bun-no)
113 *
\e$BJ8@a$,BgJ8@a$N@hF,$J$i
\e(B t
115 * (wnn-server-dai-end bun-no)
119 *
\e$B<!$NBgJ8@a$NJ8@aHV9f$rF@$k!#
\e(B
121 * (wnn-server-henkan-kakutei kouho-no dai)
126 *
\e$B8uJdHV9f$G<($5$l$?8uJd$rA*Br$9$k!#
\e(B
127 * (wnn-server-zenkouho)
\e$B$r8F$s$F$+$i$G$J$$$H$$$1$J$$!#
\e(B
129 * (wnn-server-bunsetu-henkou bunsetu-no bunsetu-length dai)
130 * bunsetu-no: INTEGER
131 * bunsetu-length: INTEGER
135 *
\e$BJ8@a$ND9$5$rJQ99$9$k!#
\e(B
137 * (wnn-bunsetu-kouho-inspect bunsetu-no)
138 * bunsetu-no: INTEGER
139 * RETURNS: (kanji yomi jisho-no serial-no hinsi hindo
140 * ima hyoka daihyoka kangovect)
142 *
\e$BJ8@a$N?'!9$J>pJs$rJQ49%P%C%U%!$+$i$H$j=P$9!#
\e(B
144 * (wnn-server-henkan-quit)
147 *
\e$B2?$b$7$J$$!#
\e(B
149 * (wnn-server-bunsetu-kanji bun-no)
150 * RETURNS: (bunsetu-kanji length)
153 * (wnn-server-bunsetu-yomi bun-no)
154 * RETURNS: (bunsetu-yomi length)
157 * (wnn-server-bunsetu-suu)
158 * RETURNS: bunsetu-suu
161 * (wnn-server-hindo-update &optional bunsetu-no)
162 * bunsetu-no: INTEGER
165 *
\e$BIQEY>pJs$r99?7$9$k!#
\e(B
167 * (wnn-server-word-add dic-no tango yomi comment hinsi)
175 *
\e$B<-=q$KC18l$rEPO?$9$k!#
\e(B
177 * (wnn-server-word-delete dic-no entry)
182 *
\e$B<-=q$+$i%(%s%H%jHV9f$G<($5$l$kC18l$r:o=|$9$k!#
\e(B
184 * (wnn-server-word-use dic-no entry)
189 *
\e$B<-=q$+$i%(%s%H%jHV9f$G<($5$l$kC18l$NM-8z!?L58z$r%H%0%k$9$k!#
\e(B
191 * (wnn-server-word-info dic-no entry)
194 * RETURNS: (yomi kanji comment hindo hinsi)
196 *
\e$B<-=q$+$i%(%s%H%jHV9f$G<($5$l$kC18l$N>pJs$rF@$k!#
\e(B
198 * (wnn-server-word-hindo-set dic-no entry hindo)
204 *
\e$B<-=q$+$i%(%s%H%jHV9f$G<($5$l$kC18l$NIQEY$r@_Dj$9$k!#
\e(B
206 * (wnn-server-word-search yomi)
208 * RETURNS: a LIST of dict-joho
210 *
\e$BA4$F$N<-=q$+$iC18l8!:w$r9T$J$&!#
\e(B
212 * (wnn-server-dict-save)
215 *
\e$BA4$F$N<-=q$HIQEY%U%!%$%k$r%;!<%V$9$k!#
\e(B
217 * (wnn-server-get-param)
218 * RETURNS: (n nsho p1 p2 p3 ... p15)
219 * DESCRIPTION:
\e$BJQ49%Q%i%a!<%?$rF@$k!#
\e(B
221 * (wnn-server-set-param n sho p1 ... p15)
222 * RETURNS:
\e$B%(%i!<$N;~
\e(B nil
223 * DESCRIPTION:
\e$BJQ49%Q%i%a!<%?$r@_Dj$9$k!#
\e(B
225 * (wnn-server-get-msg error-no)
226 * RETURNS:
\e$B%(%i!<%a225;!<%8
\e(B
227 * DESCRIPTION:
\e$B%(%i!<HV9f$+$i%a%C%;!<%8$rF@$k!#
\e(B
229 * (wnn-server-fuzokugo-set fname)
230 * RETURNS:
\e$B%(%i!<$N;~
\e(B nil
231 * DESCRIPTION:
\e$B%P%C%U%!$KImB08l%U%!%$%k$rFI$_9~$`!#
\e(B
233 * (wnn-server-fuzokugo-get)
234 * RETURNS:
\e$B%U%!%$%kL>
\e(B
235 * DESCRIPTION:
\e$B%P%C%U%!$NImB08l%U%!%$%kL>$rF@$k!#
\e(B
237 * (wnn-server-isconnect)
238 * RETURNS:
\e$B%3%M%/%H$7$F$l$P
\e(B t,
\e$B$7$F$J$1$l$P
\e(B nil
239 * DESCRIPTION:
\e$B%5!<%P$H7Q$C$F$$$k$+D4$Y$k!#
\e(B
241 * (wnn-server-hinsi-dicts hinsi-no)
242 * RETURNS: (dic-no1 dic-no2 ...)
243 * DESCRIPTION: hinsi-no
\e$B$NIJ;l$,EPO?$G$-$k<-=q$N%j%9%H$rF@$k!#
\e(B
244 * hinsi-no = -1
\e$B$N$H$-$K$O!"EPO?2DG=$JA4<-=q$rF@$k!#
\e(B
246 * (wnn-server-hinsi-list dic-no name)
247 * RETURNS: (name1 name2 ... )
248 * DESCRIPTION: dic-no
\e$B$N<-=q$G!"IJ;l%N!<%I$KB0$9$k
\e(B
249 *
\e$BIJ;l%N!<%I!JL>!K$N%j%9%H$rF@$k!#
\e(B
250 *
\e$BIJ;lL>$rM?$($?;~$O!"#0$rJV$9!#
\e(B
252 * (wnn-server-hinsi-name hinsi-no)
253 * RETURNS: hinsi-name
254 * DESCRIPTION:
\e$BIJ;lHV9f$+$iL>A0$r<h$k!#
\e(B
256 * (wnn-server-hinsi-number hinsi-name)
258 * DESCRIPTION:
\e$BIJ;lL>$rIJ;lHV9f$KJQ49$9$k!#
\e(B
260 * (wnn-server-version)
261 * RETURNS: version ID(int)
269 #include "ui/window.h"
272 #include "wnn/commonhd.h"
273 #include "mule-charset.h"
274 #include "wnn/jllib.h"
275 #include "wnn/cplib.h"
277 /* UCHAR
\e$B$,Fs=EDj5A$5$l$k$N$G
\e(B */
280 #define EGG_TIMEOUT 5
282 #define WNNSERVER_J 0
283 #define WNNSERVER_C 1
284 #define WNNSERVER_T 2
285 #define WNNSERVER_K 3
287 int check_wnn_server_type(void);
288 void w2m(w_char * wp, unsigned char *mp, unsigned char lb);
289 void m2w(unsigned char *mp, w_char * wp);
290 void w2y(w_char * w);
291 void c2m(unsigned char *cp, unsigned char *mp, unsigned char lb);
292 static void puts2(char *s);
293 static int dai_end(int no, int server);
294 static int yes_or_no(unsigned char *s);
296 /* Why doesn't wnn have a prototype for these? */
297 typedef unsigned int letter;
298 int cwnn_yincod_pzy(w_char *, w_char, int);
299 int cwnn_pzy_yincod(letter *, letter *, int);
301 static struct wnn_buf *wnnfns_buf[NSERVER];
302 static struct wnn_env *wnnfns_env_norm[NSERVER];
303 static struct wnn_env *wnnfns_env_rev[NSERVER];
304 static int wnnfns_norm;
305 static unsigned char lb_wnn_server_type[NSERVER] =
306 { LEADING_BYTE_JAPANESE_JISX0208, LEADING_BYTE_CHINESE_GB2312,
307 LEADING_BYTE_THAI_TIS620, LEADING_BYTE_KOREAN_KSC5601 };
309 /* Lisp Variables and Constants Definition */
310 Lisp_Object Qjserver;
311 Lisp_Object Qcserver;
312 /*Lisp_Object Qtserver;*/
313 Lisp_Object Qkserver;
314 Lisp_Object Qwnn_no_uniq;
315 Lisp_Object Qwnn_uniq;
316 Lisp_Object Qwnn_uniq_kanji;
317 Lisp_Object Qwnn_n, Qwnn_nsho, Qwnn_hindo, Qwnn_len, Qwnn_jiri, Qwnn_flag;
318 Lisp_Object Qwnn_jisho, Qwnn_sbn, Qwnn_dbn_len, Qwnn_sbn_cnt, Qwnn_suuji;
319 Lisp_Object Qwnn_kana, Qwnn_eisuu, Qwnn_kigou, Qwnn_toji_kakko, Qwnn_fuzokogo,
321 Lisp_Object Vwnn_server_type;
322 Lisp_Object Vcwnn_zhuyin;
323 Lisp_Object Vwnnenv_sticky;
324 Lisp_Object Vwnn_uniq_level;
327 /* Lisp functions definition */
329 DEFUN("wnn-server-open", Fwnn_open, 2, 2, 0, /*
330 Connect to jserver of host HNAME, make an environment with
331 login name LNAME in the server.
332 Return nil if error occurs.
343 snum = check_wnn_server_type();
353 strcpy (langname, "zh_TW");
363 size = XSTRING_LENGTH(lname) > 1024 ? 1026 : XSTRING_LENGTH(lname) + 2;
364 envname = alloca(size);
365 strncpy(envname, (char *)XSTRING_DATA(lname), size - 2);
366 envname[size - 2] = '\0';
372 XSTRING_LENGTH(hname) >
373 1024 ? 1025 : XSTRING_LENGTH(hname) + 1;
375 hostname = alloca(size);
376 strncpy(hostname, (char *)XSTRING_DATA(hname), size - 1);
377 hostname[size - 1] = '\0';
380 /* 97/4/16 jhod@po.iijnet.or.jp
381 * libwnn uses SIGALRM, so we need to stop and start interrupts.
384 if (!(wnnfns_buf[snum] = jl_open_lang(envname, hostname, langname,
385 0, 0, 0, EGG_TIMEOUT))) {
389 if (!jl_isconnect(wnnfns_buf[snum])) {
393 wnnfns_env_norm[snum] = jl_env_get(wnnfns_buf[snum]);
394 /* if (Vwnnenv_sticky == Qt) jl_env_sticky_e (wnnfns_env_norm[snum]);
395 else jl_env_un_sticky_e (wnnfns_env_norm[snum]);*/
396 strcat(envname, "R");
398 (wnnfns_env_rev[snum] =
399 jl_connect_lang(envname, hostname, langname, 0, 0, 0,
404 /* if (Vwnnenv_sticky == Qt) jl_env_sticky_e (wnnfns_env_rev[snum]);
405 else jl_env_un_sticky_e (wnnfns_env_rev[snum]);*/
410 DEFUN("wnn-server-close", Fwnn_close, 0, 0, 0, /*
411 Close the connection to jserver, Dictionary and frequency files
417 if ((snum = check_wnn_server_type()) == -1)
419 if (!wnnfns_buf[snum])
421 if (wnnfns_env_norm[snum]) {
422 if (NILP(Vwnnenv_sticky))
423 jl_env_un_sticky_e(wnnfns_env_norm[snum]);
425 jl_env_sticky_e(wnnfns_env_norm[snum]);
426 jl_disconnect(wnnfns_env_norm[snum]);
428 if (wnnfns_env_rev[snum]) {
429 if (NILP(Vwnnenv_sticky))
430 jl_env_un_sticky_e(wnnfns_env_rev[snum]);
432 jl_env_sticky_e(wnnfns_env_rev[snum]);
433 jl_disconnect(wnnfns_env_rev[snum]);
435 jl_env_set(wnnfns_buf[snum], 0);
436 jl_close(wnnfns_buf[snum]);
437 wnnfns_buf[snum] = (struct wnn_buf *)0;
438 wnnfns_env_norm[snum] = wnnfns_env_rev[snum] = (struct wnn_env *)0;
442 DEFUN("wnn-server-dict-add", Fwnn_dict_add, 5, MANY, 0, /*
443 Add dictionary specified by DICT-FILE-NAME, FREQ-FILE-NAME,
444 PRIORITY, DICT-FILE-MODE, FREQ-FILE-MODE.
445 Specify password files of dictionary and frequency, PW1 and PW2, if needed.
447 (int nargs, Lisp_Object * args))
451 CHECK_STRING(args[0]);
452 CHECK_STRING(args[1]);
455 CHECK_STRING(args[5]);
457 CHECK_STRING(args[6]);
458 if ((snum = check_wnn_server_type()) == -1)
460 if (!wnnfns_buf[snum])
463 gcpro1.nvars = nargs;
464 if (jl_dic_add(wnnfns_buf[snum],
465 XSTRING_DATA(args[0]),
466 XSTRING_DATA(args[1]),
467 wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV,
469 NILP(args[3]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
470 NILP(args[4]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
471 NILP(args[5]) ? 0 : XSTRING_DATA(args[5]),
472 NILP(args[6]) ? 0 : XSTRING_DATA(args[6]),
473 yes_or_no, puts2) < 0) {
481 DEFUN("wnn-server-dict-delete", Fwnn_dict_delete, 1, 1, 0, /*
482 Remove dictionary specified by DIC-NUMBER from buffer.
489 if ((snum = check_wnn_server_type()) == -1)
492 if (!wnnfns_buf[snum])
494 if (jl_dic_delete(wnnfns_buf[snum], no) < 0)
499 DEFUN("wnn-server-dict-list", Fwnn_dict_list, 0, 0, 0, /*
500 Return information of dictionaries.
504 WNN_DIC_INFO *dicinfo;
506 unsigned char comment[1024];
511 if ((snum = check_wnn_server_type()) == -1)
513 lb = lb_wnn_server_type[snum];
514 if (!wnnfns_buf[snum])
517 if ((cnt = jl_fi_dic_list(wnnfns_buf[snum], 0x3f, &dicinfo)) < 0)
520 if ((cnt = jl_dic_list(wnnfns_buf[snum], &dicinfo)) < 0)
524 for (i = 0, dicinfo += cnt; i < cnt; i++) {
526 w2m(dicinfo->comment, comment, lb);
527 /* #### The following has not been Mule-ized!!
528 fname and comment must be ASCII strings! */
530 Fcons(Fcons(make_int(dicinfo->dic_no),
531 list4(make_string((Bufbyte *) (dicinfo->fname),
532 strlen(dicinfo->fname)),
534 strlen((char *)comment)),
535 make_int(dicinfo->gosuu),
536 make_int(dicinfo->nice))), val);
541 DEFUN("wnn-server-dict-comment", Fwnn_dict_comment, 2, 2, 0, /*
542 Set comment to dictionary specified by DIC-NUMBER.
543 Comment string COMMENT.
550 CHECK_STRING(comment);
551 if ((snum = check_wnn_server_type()) == -1)
553 if (!wnnfns_buf[snum])
555 m2w(XSTRING_DATA(comment), wbuf);
556 if (jl_dic_comment_set(wnnfns_buf[snum], XINT(dicno), wbuf) < 0)
561 DEFUN("wnn-server-set-rev", Fwnn_set_rev, 1, 1, 0, /*
562 Switch the translation mode to normal if T, or reverse if NIL.
567 if ((snum = check_wnn_server_type()) == -1)
570 if ((!wnnfns_buf[snum]) || (!wnnfns_env_norm[snum]))
572 jl_env_set(wnnfns_buf[snum], wnnfns_env_norm[snum]);
575 if ((!wnnfns_buf[snum]) || (!wnnfns_env_rev[snum]))
577 jl_env_set(wnnfns_buf[snum], wnnfns_env_rev[snum]);
583 DEFUN("wnn-server-henkan-begin", Fwnn_begin_henkan, 1, 1, 0, /*
584 Translate YOMI string to kanji. Retuen the number of bunsetsu.
591 CHECK_STRING(hstring);
592 if ((snum = check_wnn_server_type()) == -1)
594 if (!wnnfns_buf[snum])
596 m2w(XSTRING_DATA(hstring), wbuf);
597 if (snum == WNNSERVER_C)
602 jl_fi_ren_conv(wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0)
605 if ((cnt = jl_ren_conv(wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0)
608 return make_int(cnt);
611 DEFUN("wnn-server-zenkouho", Fwnn_zenkouho, 2, 2, 0, /*
612 Get zenkouho at BUNSETSU-NUMBER. Second argument DAI is t.
613 if dai-bunsetsu, NIL if sho-bunsetsu. Return the current offset of zenkouho.
621 if ((snum = check_wnn_server_type()) == -1)
623 if (!wnnfns_buf[snum])
626 if (EQ(Vwnn_uniq_level, Qwnn_no_uniq))
627 uniq_level = WNN_NO_UNIQ;
628 else if (EQ(Vwnn_uniq_level, Qwnn_uniq))
629 uniq_level = WNN_UNIQ;
631 uniq_level = WNN_UNIQ_KNJ;
633 if ((offset = jl_zenkouho(wnnfns_buf[snum], no, WNN_USE_MAE,
638 jl_zenkouho_dai(wnnfns_buf[snum], no, dai_end(no, snum),
639 WNN_USE_MAE, uniq_level)) < 0)
642 return make_int(offset);
645 DEFUN("wnn-server-get-zenkouho", Fwnn_get_zenkouho, 1, 1, 0, /*
646 Get kanji string of KOUHO-NUMBER.
650 unsigned char kanji_buf[256];
655 if ((snum = check_wnn_server_type()) == -1)
657 lb = lb_wnn_server_type[snum];
658 if (!wnnfns_buf[snum])
660 jl_get_zenkouho_kanji(wnnfns_buf[snum], XINT(kouhoNo), wbuf);
661 w2m(wbuf, kanji_buf, lb);
662 return make_string(kanji_buf, strlen((char *)kanji_buf));
665 DEFUN("wnn-server-zenkouho-bun", Fwnn_zenkouho_bun, 0, 0, 0, /*
671 if ((snum = check_wnn_server_type()) == -1)
673 return make_int(jl_zenkouho_bun(wnnfns_buf[snum]));
676 DEFUN("wnn-server-zenkouho-suu", Fwnn_zenkouho_suu, 0, 0, 0, /*
677 Return the number of zen kouho.
682 if ((snum = check_wnn_server_type()) == -1)
684 return make_int(jl_zenkouho_suu(wnnfns_buf[snum]));
687 DEFUN("wnn-server-dai-top", Fwnn_dai_top, 1, 1, 0, /*
688 Return t if bunsetsu BUN-NUMBER is dai-bunsetsu.
694 if ((snum = check_wnn_server_type()) == -1)
696 if (!wnnfns_buf[snum])
698 if (jl_dai_top(wnnfns_buf[snum], XINT(bunNo)) == 1)
704 DEFUN("wnn-server-dai-end", Fwnn_dai_end, 1, 1, 0, /*
705 Return the bunsetu number of the next dai-bunsetsu after BUN-NUMBER.
711 if ((snum = check_wnn_server_type()) == -1)
713 if (!wnnfns_buf[snum])
715 return make_int(dai_end(XINT(bunNo), snum));
718 DEFUN("wnn-server-henkan-kakutei", Fwnn_kakutei, 2, 2, 0, /*
719 Set candidate with OFFSET, DAI. DAI is T if dai-bunsetsu.
725 if ((snum = check_wnn_server_type()) == -1)
727 if (!wnnfns_buf[snum])
730 if (jl_set_jikouho(wnnfns_buf[snum], XINT(offset)) < 0)
733 if (jl_set_jikouho_dai(wnnfns_buf[snum], XINT(offset)) < 0)
739 DEFUN("wnn-server-bunsetu-henkou", Fwnn_bunsetu_henkou, 3, 3, 0, /*
740 Change length of BUN-NUMBER bunsetu to LEN. DAI is T if dai-bunsetsu.
748 if ((snum = check_wnn_server_type()) == -1)
750 if (!wnnfns_buf[snum])
755 jl_fi_nobi_conv(wnnfns_buf[snum], no, XINT(len), -1, WNN_USE_MAE,
756 NILP(dai) ? WNN_SHO : WNN_DAI)) < 0)
760 jl_nobi_conv(wnnfns_buf[snum], no, XINT(len), -1, WNN_USE_MAE,
761 NILP(dai) ? WNN_SHO : WNN_DAI)) < 0)
764 return make_int(cnt);
767 DEFUN("wnn-server-inspect", Fwnn_inspect, 1, 1, 0, /*
768 Get bunsetsu information specified by BUN-NUMBER.
773 unsigned char cbuf[512];
775 int bun_no, yomilen, jirilen, i;
779 if ((snum = check_wnn_server_type()) == -1)
781 lb = lb_wnn_server_type[snum];
782 if (!wnnfns_buf[snum])
784 bun_no = XINT(bunNo);
786 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->kangovect), val);
787 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->daihyoka), val);
788 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->hyoka), val);
789 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->ima), val);
790 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->hindo), val);
791 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->hinsi), val);
792 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->entry), val);
793 val = Fcons(make_int(wnnfns_buf[snum]->bun[bun_no]->dic_no), val);
794 yomilen = jl_get_yomi(wnnfns_buf[snum], bun_no, bun_no + 1, wbuf);
795 jirilen = wnnfns_buf[snum]->bun[bun_no]->jirilen;
796 for (i = yomilen; i >= jirilen; i--)
797 wbuf[i + 1] = wbuf[i];
800 val = Fcons(make_string(cbuf, strlen((char *)cbuf)), val);
801 jl_get_kanji(wnnfns_buf[snum], bun_no, bun_no + 1, wbuf);
803 val = Fcons(make_string(cbuf, strlen((char *)cbuf)), val);
807 DEFUN("wnn-server-henkan-quit", Fwnn_quit_henkan, 0, 0, 0, /*
813 if ((snum = check_wnn_server_type()) == -1)
815 if (!wnnfns_buf[snum])
820 DEFUN("wnn-server-bunsetu-kanji", Fwnn_bunsetu_kanji, 1, 1, 0, /*
821 Get the pair of kanji and length of bunsetsu specified by BUN-NUMBER.
826 unsigned char kanji_buf[256];
832 if ((snum = check_wnn_server_type()) == -1)
834 lb = lb_wnn_server_type[snum];
835 if (!wnnfns_buf[snum])
838 kanji_len = jl_get_kanji(wnnfns_buf[snum], no, no + 1, wbuf);
839 w2m(wbuf, kanji_buf, lb);
840 return Fcons(make_string(kanji_buf, strlen((char *)kanji_buf)),
841 make_int(kanji_len));
844 DEFUN("wnn-server-bunsetu-yomi", Fwnn_bunsetu_yomi, 1, 1, 0, /*
845 Get the pair of yomi and length of bunsetsu specified by BUN-NUMBER.
850 unsigned char yomi_buf[256];
856 if ((snum = check_wnn_server_type()) == -1)
858 lb = lb_wnn_server_type[snum];
859 if (!wnnfns_buf[snum])
862 yomi_len = jl_get_yomi(wnnfns_buf[snum], no, no + 1, wbuf);
863 w2m(wbuf, yomi_buf, lb);
864 return Fcons(make_string(yomi_buf, strlen((char *)yomi_buf)),
868 DEFUN("wnn-server-bunsetu-suu", Fwnn_bunsetu_suu, 0, 0, 0, /*
869 Get the number of bunsetsu.
874 if ((snum = check_wnn_server_type()) == -1)
876 if (!wnnfns_buf[snum])
878 return make_int(jl_bun_suu(wnnfns_buf[snum]));
881 DEFUN("wnn-server-hindo-update", Fwnn_hindo_update, 0, 1, 0, /*
882 Update frequency of bunsetsu specified by NUM-NUMBER.
888 if ((snum = check_wnn_server_type()) == -1)
896 if (!wnnfns_buf[snum])
899 if (jl_optimize_fi(wnnfns_buf[snum], 0, no) < 0)
902 if (jl_update_hindo(wnnfns_buf[snum], 0, no) < 0)
908 DEFUN("wnn-server-word-add", Fwnn_word_toroku, 5, 5, 0, /*
909 Add a word to dictionary. Arguments are
910 DIC-NUMBER, KANJI, YOMI, COMMENT, HINSI-NUMBER.
912 (dicno, kanji, yomi, comment, hinsi))
914 w_char yomi_buf[256], kanji_buf[256], comment_buf[256];
919 CHECK_STRING(comment);
921 if ((snum = check_wnn_server_type()) == -1)
923 if (!wnnfns_buf[snum])
925 m2w(XSTRING_DATA(yomi), yomi_buf);
926 if (snum == WNNSERVER_C)
928 m2w(XSTRING_DATA(kanji), kanji_buf);
929 m2w(XSTRING_DATA(comment), comment_buf);
930 if (jl_word_add(wnnfns_buf[snum], XINT(dicno), yomi_buf, kanji_buf,
931 comment_buf, XINT(hinsi), 0) < 0)
937 DEFUN("wnn-server-word-delete", Fwnn_word_sakujo, 2, 2, 0, /*
938 Delete a word from dictionary, specified by DIC-NUMBER, SERIAL-NUMBER.
945 if ((snum = check_wnn_server_type()) == -1)
947 if (!wnnfns_buf[snum])
949 if (jl_word_delete(wnnfns_buf[snum], XINT(no), XINT(serial)) < 0)
955 DEFUN("wnn-server-word-use", Fwnn_word_use, 2, 2, 0, /*
956 Toggle on/off word, specified by DIC-NUMBER and SERIAL-NUMBER.
963 if ((snum = check_wnn_server_type()) == -1)
965 if (!wnnfns_buf[snum])
967 if (jl_word_use(wnnfns_buf[snum], XINT(no), XINT(serial)) < 0)
973 DEFUN("wnn-server-word-info", Fwnn_word_info, 2, 2, 0, /*
974 Return list of yomi, kanji, comment, hindo, hinshi.
979 struct wnn_jdata *info_buf;
980 unsigned char cbuf[512];
985 if ((snum = check_wnn_server_type()) == -1)
987 lb = lb_wnn_server_type[snum];
988 if (!wnnfns_buf[snum])
990 if ((info_buf = jl_word_info(wnnfns_buf[snum],
991 XINT(no), XINT(serial))) != NULL) {
995 val = Fcons(make_int(info_buf->hinshi), val);
996 val = Fcons(make_int(info_buf->hindo), val);
997 w2m(info_buf->com, cbuf, lb);
998 val = Fcons(make_string(cbuf, strlen((char *)cbuf)), val);
999 w2m(info_buf->kanji, cbuf, lb);
1000 val = Fcons(make_string(cbuf, strlen((char *)cbuf)), val);
1001 w2m(info_buf->yomi, cbuf, lb);
1002 val = Fcons(make_string(cbuf, strlen((char *)cbuf)), val);
1007 DEFUN("wnn-server-word-hindo-set", Fwnn_hindo_set, 3, 3, 0, /*
1008 Set frequency to arbitrary value. Specified by DIC-NUMBER,
1009 SERIAL-NUMBER, FREQUENCY.
1011 (no, serial, hindo))
1017 if ((snum = check_wnn_server_type()) == -1)
1019 if (!wnnfns_buf[snum])
1021 if (js_hindo_set(jl_env_get(wnnfns_buf[snum]),
1023 XINT(serial), WNN_HINDO_NOP, XINT(hindo)) < 0)
1029 DEFUN("wnn-server-word-search", Fwnn_dict_search, 1, 1, 0, /*
1030 Search a word YOMI from buffer.
1031 Return list of (kanji hinshi freq dic_no serial).
1036 struct wnn_jdata *wordinfo;
1039 unsigned char kanji_buf[256];
1043 if ((snum = check_wnn_server_type()) == -1)
1045 lb = lb_wnn_server_type[snum];
1046 if (!wnnfns_buf[snum])
1048 m2w(XSTRING_DATA(yomi), wbuf);
1049 if (snum == WNNSERVER_C)
1051 if ((count = jl_word_search_by_env(wnnfns_buf[snum],
1052 wbuf, &wordinfo)) < 0)
1055 for (i = 0, wordinfo += count; i < count; i++) {
1057 w2m(wordinfo->kanji, kanji_buf, lb);
1060 (make_string(kanji_buf, strlen((char *)kanji_buf)),
1061 list4(make_int(wordinfo->hinshi),
1062 make_int(wordinfo->hindo),
1063 make_int(wordinfo->dic_no),
1064 make_int(wordinfo->serial))), val);
1069 DEFUN("wnn-server-dict-save", Fwnn_dict_save, 0, 0, 0, /*
1070 Save all dictionaries and frequency files.
1075 if ((snum = check_wnn_server_type()) == -1)
1077 if (!wnnfns_buf[snum])
1079 if (jl_dic_save_all(wnnfns_buf[snum]) < 0)
1085 DEFUN("wnn-server-get-param", Fwnn_get_param, 0, 0, 0, /*
1086 Returns (n nsho hindo len jiri flag jisho sbn dbn_len sbn_cnt
1087 suuji kana eisuu kigou toji_kakko fuzokogo kaikakko)
1091 struct wnn_param param;
1093 if ((snum = check_wnn_server_type()) == -1)
1095 if (!wnnfns_buf[snum])
1097 if (jl_param_get(wnnfns_buf[snum], ¶m) < 0)
1099 return Fcons(make_int(param.n),
1100 Fcons(make_int(param.nsho),
1101 Fcons(make_int(param.p1),
1102 Fcons(make_int(param.p2),
1103 Fcons(make_int(param.p3),
1104 Fcons(make_int(param.p4),
1105 Fcons(make_int(param.p5),
1142 Qnil)))))))))))))))));
1145 DEFUN("wnn-server-set-param", Fwnn_set_param, 1, 1, 0, /*
1146 Set parameters using an alist, where the CAR contains one of
1147 wnn_n, wnn_nsho, wnn_hindo, wnn_len, wnn_jiri, wnn_flag,
1148 wnn_jisho, wnn_sbn, wnn_dbn_len, wnn_sbn_cnt, wnn_suuji,
1149 wnn_kana, wnn_eisuu, wnn_kigou, wnn_toji_kakko, wnn_fuzokogo,
1150 or wnn_kaikakko and the CDR contains the value.
1155 struct wnn_param param;
1158 if ((snum = check_wnn_server_type()) == -1)
1160 if (!wnnfns_buf[snum])
1162 rc = jl_param_get(wnnfns_buf[snum], ¶m);
1167 EXTERNAL_PROPERTY_LIST_LOOP_3(key, val, Vsetvalues_alist) {
1171 if (EQ(key, Qwnn_n))
1173 else if (EQ(key, Qwnn_nsho))
1174 param.nsho = setval;
1175 else if (EQ(key, Qwnn_hindo))
1177 else if (EQ(key, Qwnn_len))
1179 else if (EQ(key, Qwnn_jiri))
1181 else if (EQ(key, Qwnn_flag))
1183 else if (EQ(key, Qwnn_jisho))
1185 else if (EQ(key, Qwnn_sbn))
1187 else if (EQ(key, Qwnn_dbn_len))
1189 else if (EQ(key, Qwnn_sbn_cnt))
1191 else if (EQ(key, Qwnn_suuji))
1193 else if (EQ(key, Qwnn_kana))
1195 else if (EQ(key, Qwnn_eisuu))
1197 else if (EQ(key, Qwnn_kigou))
1199 else if (EQ(key, Qwnn_toji_kakko))
1201 else if (EQ(key, Qwnn_fuzokogo))
1203 else if (EQ(key, Qwnn_kaikakko))
1206 signal_simple_error("Invalid wnn keyword", key);
1213 printf("wnn_n = %d\n", param.n);
1214 printf("wnn_nsho = %d\n", param.nsho);
1215 printf("wnn_hindo = %d\n", param.p1);
1216 printf("wnn_len = %d\n", param.p2);
1217 printf("wnn_jiri = %d\n", param.p3);
1218 printf("wnn_flag = %d\n", param.p4);
1219 printf("wnn_jisho = %d\n", param.p5);
1220 printf("wnn_sbn = %d\n", param.p6);
1221 printf("wnn_dbn_len = %d\n", param.p7);
1222 printf("wnn_sbn_cnt = %d\n", param.p8);
1223 printf("wnn_suuji = %d\n", param.p9);
1224 printf("wnn_kana = %d\n", param.p10);
1225 printf("wnn_eisuu = %d\n", param.p11);
1226 printf("wnn_kigou = %d\n", param.p12);
1227 printf("wnn_toji_kakko = %d\n", param.p13);
1228 printf("wnn_fuzokogo = %d\n", param.p14);
1229 printf("wnn_kaikakko = %d\n", param.p15);
1232 rc = jl_param_set(wnnfns_buf[snum], ¶m);
1238 DEFUN("wnn-server-get-msg", Fwnn_get_msg, 0, 0, 0, /*
1239 Get message string from wnn_perror.
1243 unsigned char mbuf[256];
1248 /* CHECK_INT (errno);*/
1249 if ((snum = check_wnn_server_type()) == -1)
1251 lb = lb_wnn_server_type[snum];
1254 strcpy(langname, "ja_JP");
1257 strcpy(langname, "zh_CN");
1261 strcpy (langname, "zh_TW");
1265 strcpy(langname, "ko_KR");
1268 if (!wnnfns_buf[snum])
1270 /* msgp = msg_get (wnn_msg_cat, XINT (errno), 0, 0);*/
1271 msgp = wnn_perror_lang(langname);
1272 c2m((unsigned char *)msgp, mbuf, lb);
1273 return make_string(mbuf, strlen((char *)mbuf));
1276 DEFUN("wnn-server-fuzokugo-set", Fwnn_fuzokugo_set, 1, 1, 0, /*
1283 if ((snum = check_wnn_server_type()) == -1)
1285 if (!wnnfns_buf[snum])
1287 if (jl_fuzokugo_set(wnnfns_buf[snum], XSTRING_DATA(file)) < 0)
1292 DEFUN("wnn-server-fuzokugo-get", Fwnn_fuzokugo_get, 0, 0, 0, /*
1299 if ((snum = check_wnn_server_type()) == -1)
1301 if (!wnnfns_buf[snum])
1303 if (jl_fuzokugo_get(wnnfns_buf[snum], fname) < 0)
1305 return make_string((Bufbyte *) fname, strlen(fname));
1308 DEFUN("wnn-server-isconnect", Fwnn_isconnect, 0, 0, 0, /*
1314 if ((snum = check_wnn_server_type()) == -1)
1316 if (!wnnfns_buf[snum])
1318 if (jl_isconnect(wnnfns_buf[snum]))
1324 DEFUN("wnn-server-hinsi-dicts", Fwnn_hinsi_dicts, 1, 1, 0, /*
1334 if ((snum = check_wnn_server_type()) == -1)
1336 if (!wnnfns_buf[snum])
1338 if ((cnt = jl_hinsi_dicts(wnnfns_buf[snum], XINT(hinsi), &area)) < 0)
1341 for (area += cnt; cnt > 0; cnt--) {
1343 val = Fcons(make_int(*area), val);
1348 DEFUN("wnn-server-hinsi-list", Fwnn_hinsi_list, 2, 2, 0, /*
1357 unsigned char cbuf[512];
1362 if ((snum = check_wnn_server_type()) == -1)
1364 lb = lb_wnn_server_type[snum];
1365 if (!wnnfns_buf[snum])
1367 m2w(XSTRING_DATA(name), wbuf);
1369 jl_hinsi_list(wnnfns_buf[snum], XINT(dicno), wbuf, &area)) < 0)
1374 for (area += cnt; cnt > 0; cnt--) {
1376 w2m(*area, cbuf, lb);
1377 val = Fcons(make_string(cbuf, strlen((char *)cbuf)), val);
1382 DEFUN("wnn-server-hinsi-name", Fwnn_hinsi_name, 1, 1, 0, /*
1387 unsigned char name[256];
1392 if ((snum = check_wnn_server_type()) == -1)
1394 lb = lb_wnn_server_type[snum];
1395 if (!wnnfns_buf[snum])
1397 if ((wname = jl_hinsi_name(wnnfns_buf[snum], XINT(no))) == 0)
1399 w2m(wname, name, lb);
1400 return make_string(name, strlen((char *)name));
1404 DEFUN("wnn-server-fisys-dict-add", Fwnn_fisys_dict_add, 3, MANY, 0, /*
1405 Add dictionary specified by FISYS-DICT-FILE-NAME, FISYS-FREQ-FILE-NAME,
1406 FISYS-FREQ-FILE-MODE.
1407 Specify password files of dictionary and frequency, PW1 and PW2, if needed.
1409 (int nargs, Lisp_Object * args))
1411 struct gcpro gcpro1;
1413 CHECK_STRING(args[0]);
1414 CHECK_STRING(args[1]);
1416 CHECK_STRING(args[3]);
1417 if ((snum = check_wnn_server_type()) == -1)
1419 if (!wnnfns_buf[snum])
1422 gcpro1.nvars = nargs;
1423 if (jl_fi_dic_add(wnnfns_buf[snum],
1424 XSTRING_DATA(args[0]),
1425 XSTRING_DATA(args[1]),
1428 NILP(args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
1430 NILP(args[3]) ? 0 : XSTRING_DATA(args[3]),
1431 yes_or_no, puts2) < 0) {
1439 DEFUN("wnn-server-fiusr-dict-add", Fwnn_fiusr_dict_add, 4, MANY, 0, /*
1440 Add dictionary specified by FIUSR-DICT-FILE-NAME, FIUSR-FREQ-FILE-NAME,
1441 FIUSR-DICT-FILE-MODE, FIUSR-FREQ-FILE-MODE.
1442 Specify password files of dictionary and frequency, PW1 and PW2, if needed.
1444 (int nargs, Lisp_Object * args))
1446 struct gcpro gcpro1;
1448 CHECK_STRING(args[0]);
1449 CHECK_STRING(args[1]);
1451 CHECK_STRING(args[4]);
1453 CHECK_STRING(args[5]);
1454 if ((snum = check_wnn_server_type()) == -1)
1456 if (!wnnfns_buf[snum])
1459 gcpro1.nvars = nargs;
1460 if (jl_fi_dic_add(wnnfns_buf[snum],
1461 XSTRING_DATA(args[0]),
1462 XSTRING_DATA(args[1]),
1464 NILP(args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
1465 NILP(args[3]) ? WNN_DIC_RDONLY : WNN_DIC_RW,
1466 NILP(args[4]) ? 0 : XSTRING_DATA(args[4]),
1467 NILP(args[5]) ? 0 : XSTRING_DATA(args[5]),
1468 yes_or_no, puts2) < 0) {
1476 DEFUN("wnn-server-notrans-dict-add", Fwnn_notrans_dict_add, 3, MANY, 0, /*
1477 Add dictionary specified by NOTRANS-DICT-FILE-NAME, PRIORITY, DICT-FILE-MODE.
1478 Specify password files of dictionary and frequency PW1 if needed.
1480 (int nargs, Lisp_Object * args))
1482 struct gcpro gcpro1;
1485 struct wnn_env *cur_env;
1486 unsigned long vmask = 0;
1487 struct wnn_henkan_env henv;
1488 CHECK_STRING(args[0]);
1491 CHECK_STRING(args[3]);
1492 if ((snum = check_wnn_server_type()) == -1)
1494 if (!wnnfns_buf[snum])
1497 gcpro1.nvars = nargs;
1499 cur_env = wnnfns_env_norm[snum];
1501 cur_env = wnnfns_env_rev[snum];
1502 dic_no = js_get_autolearning_dic(cur_env, WNN_MUHENKAN_LEARNING);
1503 if (dic_no == WNN_NO_LEARNING) {
1504 if ((dic_no = jl_dic_add(wnnfns_buf[snum],
1505 XSTRING_DATA(args[0]),
1507 wnnfns_norm ? WNN_DIC_ADD_NOR :
1508 WNN_DIC_ADD_REV, XINT(args[1]),
1509 WNN_DIC_RW, WNN_DIC_RW,
1511 XSTRING_DATA(args[3]), 0, yes_or_no,
1516 js_set_autolearning_dic(cur_env, WNN_MUHENKAN_LEARNING, dic_no);
1518 if (!js_is_loaded_temporary_dic(cur_env)) {
1519 if (js_temporary_dic_add(cur_env,
1520 wnnfns_norm ? WNN_DIC_ADD_NOR :
1521 WNN_DIC_ADD_REV) < 0) {
1526 vmask |= WNN_ENV_MUHENKAN_LEARN_MASK;
1527 henv.muhenkan_flag = NILP(args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW;
1528 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) {
1536 DEFUN("wnn-server-bmodify-dict-add", Fwnn_bmodify_dict_add, 3, MANY, 0, /*
1537 Add dictionary specified by BMODIFY-DICT-FILE-NAME, PRIORITY, DICT-FILE-MODE.
1538 Specify password files of dictionary and frequency PW1 if needed.
1540 (int nargs, Lisp_Object * args))
1542 struct gcpro gcpro1;
1545 struct wnn_env *cur_env;
1546 unsigned long vmask = 0;
1547 struct wnn_henkan_env henv;
1548 CHECK_STRING(args[0]);
1551 CHECK_STRING(args[3]);
1552 if ((snum = check_wnn_server_type()) == -1)
1554 if (!wnnfns_buf[snum])
1557 gcpro1.nvars = nargs;
1559 cur_env = wnnfns_env_norm[snum];
1561 cur_env = wnnfns_env_rev[snum];
1562 dic_no = js_get_autolearning_dic(cur_env, WNN_BUNSETSUGIRI_LEARNING);
1563 if (dic_no == WNN_NO_LEARNING) {
1564 if ((dic_no = jl_dic_add(wnnfns_buf[snum],
1565 XSTRING_DATA(args[0]),
1567 wnnfns_norm ? WNN_DIC_ADD_NOR :
1568 WNN_DIC_ADD_REV, XINT(args[1]),
1569 WNN_DIC_RW, WNN_DIC_RW,
1571 XSTRING_DATA(args[3]), 0, yes_or_no,
1576 js_set_autolearning_dic(cur_env, WNN_BUNSETSUGIRI_LEARNING,
1579 if (!js_is_loaded_temporary_dic(cur_env)) {
1580 if (js_temporary_dic_add(cur_env,
1581 wnnfns_norm ? WNN_DIC_ADD_NOR :
1582 WNN_DIC_ADD_REV) < 0) {
1587 vmask |= WNN_ENV_BUNSETSUGIRI_LEARN_MASK;
1588 henv.bunsetsugiri_flag = NILP(args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW;
1589 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) {
1597 DEFUN("wnn-server-set-last-is-first", Fwnn_last_is_first, 1, 1, 0, /*
1603 unsigned long vmask = 0;
1604 struct wnn_henkan_env henv;
1605 if ((snum = check_wnn_server_type()) == -1)
1607 if (!wnnfns_buf[snum])
1609 vmask |= WNN_ENV_LAST_IS_FIRST_MASK;
1610 henv.last_is_first_flag = NILP(mode) ? False : True;
1611 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1616 DEFUN("wnn-server-set-complex-conv-mode", Fwnn_complex_conv, 1, 1, 0, /*
1622 unsigned long vmask = 0;
1623 struct wnn_henkan_env henv;
1624 if ((snum = check_wnn_server_type()) == -1)
1626 if (!wnnfns_buf[snum])
1628 vmask |= WNN_ENV_COMPLEX_CONV_MASK;
1629 henv.complex_flag = NILP(mode) ? False : True;
1630 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1635 DEFUN("wnn-server-set-okuri-learn-mode", Fwnn_okuri_learn, 1, 1, 0, /*
1641 unsigned long vmask = 0;
1642 struct wnn_henkan_env henv;
1643 if ((snum = check_wnn_server_type()) == -1)
1645 if (!wnnfns_buf[snum])
1647 vmask |= WNN_ENV_OKURI_LEARN_MASK;
1648 henv.okuri_learn_flag = NILP(mode) ? False : True;
1649 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1654 DEFUN("wnn-server-set-okuri-flag", Fwnn_okuri_flag, 1, 1, 0, /*
1660 unsigned long vmask = 0;
1661 struct wnn_henkan_env henv;
1664 if ((snum = check_wnn_server_type()) == -1)
1666 if (!wnnfns_buf[snum])
1668 if (mode != WNN_OKURI_REGULATION &&
1669 mode != WNN_OKURI_NO && mode != WNN_OKURI_YES)
1672 henv.okuri_flag = mode;
1673 vmask |= WNN_ENV_OKURI_MASK;
1674 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1679 DEFUN("wnn-server-set-prefix-learn-mode", Fwnn_prefix_learn, 1, 1, 0, /*
1685 unsigned long vmask = 0;
1686 struct wnn_henkan_env henv;
1687 if ((snum = check_wnn_server_type()) == -1)
1689 if (!wnnfns_buf[snum])
1691 vmask |= WNN_ENV_PREFIX_LEARN_MASK;
1692 henv.prefix_learn_flag = NILP(mode) ? False : True;
1693 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1698 DEFUN("wnn-server-set-prefix-flag", Fwnn_prefix_flag, 1, 1, 0, /*
1704 unsigned long vmask = 0;
1705 struct wnn_henkan_env henv;
1708 if ((snum = check_wnn_server_type()) == -1)
1710 if (!wnnfns_buf[snum])
1712 if (mode != WNN_KANA_KOUHO && mode != WNN_KANJI_KOUHO)
1715 henv.prefix_flag = mode;
1716 vmask |= WNN_ENV_PREFIX_MASK;
1717 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1722 DEFUN("wnn-server-set-suffix-learn-mode", Fwnn_suffix_learn, 1, 1, 0, /*
1728 unsigned long vmask = 0;
1729 struct wnn_henkan_env henv;
1730 if ((snum = check_wnn_server_type()) == -1)
1732 if (!wnnfns_buf[snum])
1734 vmask |= WNN_ENV_SUFFIX_LEARN_MASK;
1735 henv.suffix_learn_flag = NILP(mode) ? False : True;
1736 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1741 DEFUN("wnn-server-set-common-learn-mode", Fwnn_common_learn, 1, 1, 0, /*
1747 unsigned long vmask = 0;
1748 struct wnn_henkan_env henv;
1749 if ((snum = check_wnn_server_type()) == -1)
1751 if (!wnnfns_buf[snum])
1753 vmask |= WNN_ENV_COMMON_LAERN_MASK;
1754 henv.common_learn_flag = NILP(mode) ? False : True;
1755 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1760 DEFUN("wnn-server-set-freq-func-mode", Fwnn_freq_func, 1, 1, 0, /*
1766 unsigned long vmask = 0;
1767 struct wnn_henkan_env henv;
1770 if ((snum = check_wnn_server_type()) == -1)
1772 if (!wnnfns_buf[snum])
1774 if (mode != 0 && mode != 1 && mode != 2 && mode != 3 && mode != 4)
1777 henv.freq_func_flag = mode;
1778 vmask |= WNN_ENV_FREQ_FUNC_MASK;
1779 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1784 DEFUN("wnn-server-set-numeric-mode", Fwnn_numeric, 1, 1, 0, /*
1790 unsigned long vmask = 0;
1791 struct wnn_henkan_env henv;
1794 if ((snum = check_wnn_server_type()) == -1)
1796 if (!wnnfns_buf[snum])
1798 if (mode != WNN_NUM_KANSUUJI &&
1799 mode != WNN_NUM_KANOLD &&
1800 mode != WNN_NUM_HANCAN &&
1801 mode != WNN_NUM_ZENCAN &&
1802 mode != WNN_NUM_HAN && mode != WNN_NUM_ZEN && mode != WNN_NUM_KAN)
1805 henv.numeric_flag = mode;
1806 vmask |= WNN_ENV_NUMERIC_MASK;
1807 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1812 DEFUN("wnn-server-set-alphabet-mode", Fwnn_alphabet, 1, 1, 0, /*
1818 unsigned long vmask = 0;
1819 struct wnn_henkan_env henv;
1822 if ((snum = check_wnn_server_type()) == -1)
1824 if (!wnnfns_buf[snum])
1826 if (mode != WNN_ALP_HAN && mode != WNN_ALP_ZEN)
1829 henv.alphabet_flag = mode;
1830 vmask |= WNN_ENV_ALPHABET_MASK;
1831 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1836 DEFUN("wnn-server-set-symbol-mode", Fwnn_symbol, 1, 1, 0, /*
1842 unsigned long vmask = 0;
1843 struct wnn_henkan_env henv;
1846 if ((snum = check_wnn_server_type()) == -1)
1848 if (!wnnfns_buf[snum])
1850 if (mode != WNN_KIG_HAN && mode != WNN_KIG_JIS && mode != WNN_KIG_ASC)
1853 henv.symbol_flag = mode;
1854 vmask |= WNN_ENV_SYMBOL_MASK;
1855 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1860 DEFUN("wnn-server-set-yuragi-mode", Fwnn_yuragi, 1, 1, 0, /*
1866 unsigned long vmask = 0;
1867 struct wnn_henkan_env henv;
1868 if ((snum = check_wnn_server_type()) == -1)
1870 if (!wnnfns_buf[snum])
1872 vmask |= WNN_ENV_YURAGI_MASK;
1873 henv.yuragi_flag = NILP(mode) ? False : True;
1874 if (jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0)
1879 DEFUN("wnn-reset-previous-info", Fwnn_reset_prev, 0, 0, 0, /*
1885 if ((snum = check_wnn_server_type()) == -1)
1887 if (!wnnfns_buf[snum])
1889 if (jl_reset_prev_bun(wnnfns_buf[snum]) < 0)
1895 DEFUN("wnn-server-version", Fwnn_version, 0, 0, 0, /*
1896 Returns Wnn server version ID.
1903 struct wnn_env *cur_env;
1904 if ((snum = check_wnn_server_type()) == -1)
1906 if (!wnnfns_buf[snum])
1909 cur_env = wnnfns_env_norm[snum];
1911 cur_env = wnnfns_env_rev[snum];
1912 if (js_version(cur_env->js_id, &serv, &libv) < 0)
1914 return make_int(serv);
1917 DEFUN("wnn-server-hinsi-number", Fwnn_hinsi_number, 1, 1, 0, /*
1926 if ((snum = check_wnn_server_type()) == -1)
1928 if (!wnnfns_buf[snum])
1930 m2w(XSTRING_DATA(name), w_buf);
1931 if ((no = jl_hinsi_number(wnnfns_buf[snum], w_buf)) < 0)
1933 return make_int(no);
1936 void syms_of_mule_wnn(void)
1939 DEFSUBR(Fwnn_close);
1940 DEFSUBR(Fwnn_dict_add);
1941 DEFSUBR(Fwnn_dict_delete);
1942 DEFSUBR(Fwnn_dict_list);
1943 DEFSUBR(Fwnn_dict_comment);
1944 DEFSUBR(Fwnn_set_rev);
1945 DEFSUBR(Fwnn_begin_henkan);
1946 DEFSUBR(Fwnn_zenkouho);
1947 DEFSUBR(Fwnn_get_zenkouho);
1948 DEFSUBR(Fwnn_zenkouho_bun);
1949 DEFSUBR(Fwnn_zenkouho_suu);
1950 DEFSUBR(Fwnn_dai_top);
1951 DEFSUBR(Fwnn_dai_end);
1952 DEFSUBR(Fwnn_kakutei);
1953 DEFSUBR(Fwnn_bunsetu_henkou);
1954 DEFSUBR(Fwnn_inspect);
1955 DEFSUBR(Fwnn_quit_henkan);
1956 DEFSUBR(Fwnn_bunsetu_kanji);
1957 DEFSUBR(Fwnn_bunsetu_yomi);
1958 DEFSUBR(Fwnn_bunsetu_suu);
1959 DEFSUBR(Fwnn_hindo_update);
1960 DEFSUBR(Fwnn_word_toroku);
1961 DEFSUBR(Fwnn_word_sakujo);
1962 DEFSUBR(Fwnn_word_use);
1963 DEFSUBR(Fwnn_word_info);
1964 DEFSUBR(Fwnn_hindo_set);
1965 DEFSUBR(Fwnn_dict_search);
1966 DEFSUBR(Fwnn_dict_save);
1967 DEFSUBR(Fwnn_get_param);
1968 DEFSUBR(Fwnn_set_param);
1969 DEFSUBR(Fwnn_get_msg);
1970 DEFSUBR(Fwnn_fuzokugo_set);
1971 DEFSUBR(Fwnn_fuzokugo_get);
1972 DEFSUBR(Fwnn_isconnect);
1973 DEFSUBR(Fwnn_hinsi_dicts);
1974 DEFSUBR(Fwnn_hinsi_list);
1975 DEFSUBR(Fwnn_hinsi_name);
1976 DEFSUBR(Fwnn_hinsi_number);
1978 DEFSUBR(Fwnn_fisys_dict_add);
1979 DEFSUBR(Fwnn_fiusr_dict_add);
1980 DEFSUBR(Fwnn_notrans_dict_add);
1981 DEFSUBR(Fwnn_bmodify_dict_add);
1982 DEFSUBR(Fwnn_last_is_first);
1983 DEFSUBR(Fwnn_complex_conv);
1984 DEFSUBR(Fwnn_okuri_learn);
1985 DEFSUBR(Fwnn_okuri_flag);
1986 DEFSUBR(Fwnn_prefix_learn);
1987 DEFSUBR(Fwnn_prefix_flag);
1988 DEFSUBR(Fwnn_suffix_learn);
1989 DEFSUBR(Fwnn_common_learn);
1990 DEFSUBR(Fwnn_freq_func);
1991 DEFSUBR(Fwnn_numeric);
1992 DEFSUBR(Fwnn_alphabet);
1993 DEFSUBR(Fwnn_symbol);
1994 DEFSUBR(Fwnn_yuragi);
1995 DEFSUBR(Fwnn_reset_prev);
1997 DEFSUBR(Fwnn_version);
1999 defsymbol(&Qjserver, "jserver");
2000 defsymbol(&Qcserver, "cserver");
2001 /* defsymbol (&Qtserver, "tserver"); */
2002 defsymbol(&Qkserver, "kserver");
2004 defsymbol(&Qwnn_no_uniq, "wnn-no-uniq");
2005 defsymbol(&Qwnn_uniq, "wnn-uniq");
2006 defsymbol(&Qwnn_uniq_kanji, "wnn-uniq-kanji");
2007 defsymbol(&Qwnn_n, "wnn_n");
2008 defsymbol(&Qwnn_nsho, "wnn_nsho");
2009 defsymbol(&Qwnn_hindo, "wnn_hindo");
2010 defsymbol(&Qwnn_len, "wnn_len");
2011 defsymbol(&Qwnn_jiri, "wnn_jiri");
2012 defsymbol(&Qwnn_flag, "wnn_flag");
2013 defsymbol(&Qwnn_jisho, "wnn_jisho");
2014 defsymbol(&Qwnn_sbn, "wnn_sbn");
2015 defsymbol(&Qwnn_dbn_len, "wnn_dbn_len");
2016 defsymbol(&Qwnn_sbn_cnt, "wnn_sbn_cnt");
2017 defsymbol(&Qwnn_suuji, "wnn_suuji");
2018 defsymbol(&Qwnn_kana, "wnn_kana");
2019 defsymbol(&Qwnn_eisuu, "wnn_eisuu");
2020 defsymbol(&Qwnn_kigou, "wnn_kigou");
2021 defsymbol(&Qwnn_toji_kakko, "wnn_toji_kakko");
2022 defsymbol(&Qwnn_fuzokogo, "wnn_fuzokogo");
2023 defsymbol(&Qwnn_kaikakko, "wnn_kaikakko");
2026 void reinit_vars_of_mule_wnn(void)
2030 for (i = 0; i < NSERVER; i++) {
2031 wnnfns_buf[i] = (struct wnn_buf *)0;
2032 wnnfns_env_norm[i] = (struct wnn_env *)0;
2033 wnnfns_env_rev[i] = (struct wnn_env *)0;
2037 void vars_of_mule_wnn(void)
2039 reinit_vars_of_mule_wnn();
2041 DEFVAR_INT("lb-sisheng", &lb_sisheng /*
2042 Leading character for Sisheng.
2044 DEFVAR_LISP("wnn-server-type", &Vwnn_server_type /*
2045 *jserver, cserver ..
2047 DEFVAR_LISP("cwnn-zhuyin", &Vcwnn_zhuyin /*
2050 DEFVAR_LISP("wnnenv-sticky", &Vwnnenv_sticky /*
2051 *If non-nil, make environment sticky
2053 DEFVAR_LISP("wnn-uniq-level", &Vwnn_uniq_level /*
2057 Vwnn_server_type = Qjserver;
2058 Vcwnn_zhuyin = Qnil;
2059 Vwnnenv_sticky = Qnil;
2061 Vwnn_uniq_level = Qwnn_uniq;
2063 Fprovide(intern("wnn"));
2066 void w2m(w_char * wp, unsigned char *mp, unsigned char lb)
2072 while ((wc = *wp++) != 0) {
2073 switch (wc & 0x8080) {
2075 if (EQ(Vwnn_server_type, Qcserver)) {
2076 len = cwnn_yincod_pzy(pzy, wc,
2080 for (i = 0; i < len; i++) {
2081 if (pzy[i] & 0x80) {
2082 *mp++ = PRE_LEADING_BYTE_PRIVATE_1; /* #### Not sure about this one... */
2088 *mp++ = LEADING_BYTE_KATAKANA_JISX0201;
2089 *mp++ = (wc & 0xff);
2094 *mp++ = (wc & 0xff00) >> 8;
2095 *mp++ = wc & 0x00ff;
2098 if (lb == LEADING_BYTE_JAPANESE_JISX0208)
2099 *mp++ = LEADING_BYTE_JAPANESE_JISX0212;
2100 else if (lb == LEADING_BYTE_CHINESE_BIG5_1)
2101 *mp++ = LEADING_BYTE_CHINESE_BIG5_2;
2104 *mp++ = (wc & 0xff00) >> 8;
2105 *mp++ = (wc & 0x00ff) | 0x80;
2108 *mp++ = wc & 0x00ff;
2115 void m2w(unsigned char *mp, w_char * wp)
2119 while ((ch = *mp++) != 0) {
2120 if (BUFBYTE_LEADING_BYTE_P(ch)) {
2122 case LEADING_BYTE_KATAKANA_JISX0201:
2125 case LEADING_BYTE_LATIN_JISX0201:
2126 *wp++ = *mp++ & 0x7F;
2128 case LEADING_BYTE_JAPANESE_JISX0208_1978:
2129 case LEADING_BYTE_CHINESE_GB2312:
2130 case LEADING_BYTE_JAPANESE_JISX0208:
2131 case LEADING_BYTE_KOREAN_KSC5601:
2132 /* case LEADING_BYTE_TW: */
2134 *wp++ = (ch << 8) | *mp++;
2136 case LEADING_BYTE_JAPANESE_JISX0212:
2138 *wp++ = (ch << 8) | (*mp++ & 0x7f);
2140 case PRE_LEADING_BYTE_PRIVATE_1: /* #### Not sure about this one... */
2142 if (ch == lb_sisheng)
2143 *wp++ = 0x8e80 | *mp++;
2147 default: /* ignore this character */
2148 mp += REP_BYTES_BY_FIRST_BYTE(ch) - 1;
2157 void w2y(w_char * w)
2159 letter pbuf[5000], ybuf[5000];
2175 len = cwnn_pzy_yincod(ybuf, pbuf,
2176 NILP(Vcwnn_zhuyin) ? CWNN_PINYIN : CWNN_ZHUYIN);
2182 if (*pin == 0 || len == 0) {
2193 void c2m(unsigned char *cp, unsigned char *mp, unsigned char lb)
2196 while ((ch = *cp) != 0) {
2206 static int dai_end(int no, int server)
2208 for (no++; no < jl_bun_suu(wnnfns_buf[server])
2209 && !jl_dai_top(wnnfns_buf[server], no); no++) ;
2213 static int yes_or_no(unsigned char *s)
2215 unsigned char mbuf[512];
2219 if ((snum = check_wnn_server_type()) == -1)
2221 lb = lb_wnn_server_type[snum];
2222 /* if no message found, create file without query */
2223 /* if (wnn_msg_cat->msg_bd == 0) return 1; */
2227 /* truncate "(Y/N)" */
2228 for (len = 0; (mbuf[len]) && (len < 512); len++) ;
2229 for (; (mbuf[len] != '(') && (len > 0); len--) ;
2231 Lisp_Object yes, str;
2232 struct gcpro gcpro1;
2234 str = make_string(mbuf, len);
2236 yes = call1(Qyes_or_no_p, str);
2245 static void puts2(char *s)
2247 #if 0 /* jhod: We don't really need this echoed... */
2249 Lisp_Object args[1];
2252 extern Lisp_Object Fmessage();
2254 if ((snum = check_wnn_server_type()) == -1)
2256 lb = lb_wnn_server_type[snum];
2258 args[0] = make_string(mbuf, strlen(mbuf));
2266 int check_wnn_server_type(void)
2268 if (EQ(Vwnn_server_type, Qjserver)) {
2270 } else if (EQ(Vwnn_server_type, Qcserver)) {
2273 /* else if (Vwnn_server_type == Qtserver)
2277 else if (EQ(Vwnn_server_type, Qkserver)) {