/* -*- coding: utf-8 -*- Copyright (C) 1995 Free Software Foundation, Inc. Copyright (C) 1995 Sun Microsystems, Inc. Copyright (C) 2005, 2010 Ben Wing. This file is part of XEmacs. XEmacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs. If not, see . */ /* Synched up with: Mule 2.3. Not in FSF. */ /* Jserver Interface for Mule Coded by Yutaka Ishikawa at ETL (yisikawa@etl.go.jp) Satoru Tomura at ETL (tomura@etl.go.jp) Modified for Wnn4 library by Toshiaki Shingu (shingu@cpr.canon.co.jp) Hiroshi Kuribayashi (kuri@nff.ncl.omron.co.jp) */ /* * Functions defined in this file are * (wnn-server-open wnn-host-name login-name) * wnn-host-name: STRING or NIL * login-name: STRING * RETURNS: BOOLEAN * DESCRIPTION: * jserver と接続し、サーバー内部に正変換/逆変換2つの環境を * 作る。エラーの時は nil を返す。 * * (wnn-server-close) * RETURNS: BOOLEAN * DESCRIPTION: * jserver との接続を切る。辞書、頻度はセーブされない。 * * (wnn-server-dict-add dict-file-name hindo-file-name priority * dict-file-mode hindo-file-mode pw1 pw2) * dict-file-name: STRING * hindo-file-name: STRING or NULL-STRING * priority: INTEGER * dict-file-mode: BOOLEAN * hindo-file-mode: BOOLEAN * pw1: STRING or NIL * pw2: STRING or NIL * DESCRIPTION: * 辞書ファイル名、頻度ファイル名、優先度、辞書ファイルモード * 頻度ファイルモードで指定した辞書をバッファに追加する。 * pw1, pw2 は辞書ファイル、頻度ファイルのパスワード。 * * (wnn-server-dict-delete dic-no) * dic-no: INTEGER * RETURNS: エラーの時 nil * DESCRIPTION: dic-no の辞書番号の辞書を、バッファから * 削除する。 * * (wnn-server-dict-list) * RETURNS: ((dic-no1 file-name1 comment1 word-no1 nice1) * (dic-no2 file-name2 comment2 word-no2 nice2)...) * DESCRIPTION: バッファ上の辞書のリストを得る。 * * (wnn-server-dict-comment dic-no comment) * RETURNS: エラーの時 nil * DESCRIPTION: dic-no の辞書にコメントをつける。 * * (wnn-server-set-rev rev) * rev: BOOLEAN * rev が nil の時は正変換、それ以外の時は逆変換 * * (wnn-server-henkan-begin henkan-string) * henkan-string: STRING * RETURNS: bunsetu-suu * DESCRIPTION: * 仮名漢字変換をし、第一候補の文節数を返す。 * * (wnn-server-zenkouho bunsetu-no dai) * bunsetu-no: INTEGER * dai: BOOLEAN * RETURNS: offset * DESCRIPTION: * 文節番号で指定された文節の全候補をとりだし * 、現在のオフセットを返す。 * * (wnn-server-get-zenkouho offset) * bunsetu-no: INTEGER * dai: BOOLEAN * RETURNS: list of zenkouho * DESCRIPTION: * オフセットで指定された候補を得る。 * * (wnn-server-zenkouho-bun) * RETURNS: INTEGER * DESCRIPTION: * 全候補を表示している文節番号を得る。 * * (wnn-server-zenkouho-suu) * RETURNS: INTEGER * DESCRIPTION: * 全候補を表示している文節の全候補数を得る。 * * (wnn-server-dai-top bun-no) * bun-no: INTEGER * RETURNS: BOOLEAN * DESCRIPTION: * 文節が大文節の先頭なら t * * (wnn-server-dai-end bun-no) * bun-no: INTEGER * RETURNS: INTEGER * DESCRIPTION: * 次の大文節の文節番号を得る。 * * (wnn-server-henkan-kakutei kouho-no dai) * kouho-no: INTEGER * dai: BOOLEAN * RETURNS: BOOLEAN * DESCRIPTION: * 候補番号で示された候補を選択する。 * (wnn-server-zenkouho) を呼んてからでないといけない。 * * (wnn-server-bunsetu-henkou bunsetu-no bunsetu-length dai) * bunsetu-no: INTEGER * bunsetu-length: INTEGER * dai: BOOLEAN * RETURNS: * DESCRIPTION: * 文節の長さを変更する。 * * (wnn-bunsetu-kouho-inspect bunsetu-no) * bunsetu-no: INTEGER * RETURNS: (kanji yomi jisho-no serial-no hinsi hindo * ima hyoka daihyoka kangovect) * DESCRIPTION: * 文節の色々な情報を変換バッファからとり出す。 * * (wnn-server-henkan-quit) * RETURNS: BOOLEAN * DESCRIPTION: * 何もしない。 * * (wnn-server-bunsetu-kanji bun-no) * RETURNS: (bunsetu-kanji length) * DESCRIPTION: * * (wnn-server-bunsetu-yomi bun-no) * RETURNS: (bunsetu-yomi length) * DESCRIPTION: * * (wnn-server-bunsetu-suu) * RETURNS: bunsetu-suu * DESCRIPTION: * * (wnn-server-hindo-update &optional bunsetu-no) * bunsetu-no: INTEGER * RETURNS: BOOLEAN * DESCRIPTION: * 頻度情報を更新する。 * * (wnn-server-word-add dic-no tango yomi comment hinsi) * dic-no: INTEGER * tango: STRING * yoni: STRING * comment: STRING * hinsi: INTEGER * RETURNS: BOOLEAN * DESCRIPTION: * 辞書に単語を登録する。 * * (wnn-server-word-delete dic-no entry) * dic-no: INTEGER * entry: INTEGER * RETURNS: BOOLEAN * DESCRIPTION: * 辞書からエントリ番号で示される単語を削除する。 * * (wnn-server-word-use dic-no entry) * dic-no: INTEGER * entry: INTEGER * RETURNS: BOOLEAN * DESCRIPTION: * 辞書からエントリ番号で示される単語の有効/無効をトグルする。 * * (wnn-server-word-info dic-no entry) * dic-no: INTEGER * entry: INTEGER * RETURNS: (yomi kanji comment hindo hinsi) * DESCRIPTION: * 辞書からエントリ番号で示される単語の情報を得る。 * * (wnn-server-word-hindo-set dic-no entry hindo) * dic-no: INTEGER * entry: INTEGER * hindo: INTEGER * RETURNS: BOOLEAN * DESCRIPTION: * 辞書からエントリ番号で示される単語の頻度を設定する。 * * (wnn-server-word-search yomi) * yomi: STRING * RETURNS: a LIST of dict-joho * DESCRIPTION: * 全ての辞書から単語検索を行なう。 * * (wnn-server-dict-save) * RETURNS: BOOLEAN * DESCRIPTION: * 全ての辞書と頻度ファイルをセーブする。 * * (wnn-server-get-param) * RETURNS: (n nsho p1 p2 p3 ... p15) * DESCRIPTION: 変換パラメータを得る。 * * (wnn-server-set-param n sho p1 ... p15) * RETURNS: エラーの時 nil * DESCRIPTION: 変換パラメータを設定する。 * * (wnn-server-get-msg error-no) * RETURNS: エラーメ臆技ージ * DESCRIPTION: エラー番号からメッセージを得る。 * * (wnn-server-fuzokugo-set fname) * RETURNS: エラーの時 nil * DESCRIPTION: バッファに附属語ファイルを読み込む。 * * (wnn-server-fuzokugo-get) * RETURNS: ファイル名 * DESCRIPTION: バッファの附属語ファイル名を得る。 * * (wnn-server-isconnect) * RETURNS: コネクトしてれば t, してなければ nil * DESCRIPTION: サーバと継っているか調べる。 * * (wnn-server-hinsi-dicts hinsi-no) * RETURNS: (dic-no1 dic-no2 ...) * DESCRIPTION: hinsi-no の品詞が登録できる辞書のリストを得る。 * hinsi-no = -1 のときには、登録可能な全辞書を得る。 * * (wnn-server-hinsi-list dic-no name) * RETURNS: (name1 name2 ... ) * DESCRIPTION: dic-no の辞書で、品詞ノードに属する * 品詞ノード(名)のリストを得る。 * 品詞名を与えた時は、0を返す。 * * (wnn-server-hinsi-name hinsi-no) * RETURNS: hinsi-name * DESCRIPTION: 品詞番号から名前を取る。 * * (wnn-server-hinsi-number hinsi-name) * RETURNS: hinsi-no * DESCRIPTION: 品詞名を品詞番号に変換する。 * * (wnn-server-version) * RETURNS: version ID(int) * */ #include #include "lisp.h" #include "buffer.h" #include "charset.h" #include "window.h" #include "sysdep.h" #include "wnn/commonhd.h" #include "wnn/jllib.h" #include "wnn/cplib.h" /* UCHAR が二重定義されるので */ #define _UCHAR_T #define EGG_TIMEOUT 5 #define NSERVER 4 #define WNNSERVER_J 0 #define WNNSERVER_C 1 #define WNNSERVER_T 2 #define WNNSERVER_K 3 int check_wnn_server_type (void); void w2m (w_char *wp, Ibyte *mp, Lisp_Object charset); void m2w (Ibyte *mp, w_char *wp); void w2y (w_char *w); void c2m (UExtbyte *cp, Ibyte *mp, Lisp_Object charset); static void puts2 (char *s); static int dai_end (int no, int server); static int yes_or_no (UExtbyte *s); /* Why doesn't wnn have a prototype for these? */ typedef unsigned int letter; int cwnn_yincod_pzy(w_char *, w_char, int); int cwnn_pzy_yincod(letter *, letter *, int); static struct wnn_buf *wnnfns_buf[NSERVER]; static struct wnn_env *wnnfns_env_norm[NSERVER]; static struct wnn_env *wnnfns_env_rev[NSERVER]; static int wnnfns_norm; static Lisp_Object charset_wnn_server_type[NSERVER]; /* Lisp Variables and Constants Definition */ Lisp_Object Qjserver; Lisp_Object Qcserver; /*Lisp_Object Qtserver;*/ Lisp_Object Qkserver; Lisp_Object Qwnn_no_uniq; Lisp_Object Qwnn_uniq; Lisp_Object Qwnn_uniq_kanji; Lisp_Object Qwnn_n, Qwnn_nsho, Qwnn_hindo, Qwnn_len, Qwnn_jiri, Qwnn_flag; Lisp_Object Qwnn_jisho, Qwnn_sbn, Qwnn_dbn_len, Qwnn_sbn_cnt, Qwnn_suuji; Lisp_Object Qwnn_kana, Qwnn_eisuu, Qwnn_kigou, Qwnn_toji_kakko, Qwnn_fuzokogo, Qwnn_kaikakko; Lisp_Object Vwnn_server_type; Lisp_Object Vcwnn_zhuyin; Lisp_Object Vwnnenv_sticky; Lisp_Object Vwnn_uniq_level; Lisp_Object Qchinese_sisheng; /* Lisp functions definition */ DEFUN ("wnn-server-open", Fwnn_open, 2, 2, 0, /* Connect to jserver of host HNAME, make an environment with login name LNAME in the server. Return nil if error occurs. */ (hname, lname)) { Extbyte *envname; Ascbyte *langname; Extbyte *hostname; int snum; snum = check_wnn_server_type (); switch (snum) { case WNNSERVER_J: langname = "ja_JP"; break; case WNNSERVER_C: langname = "zh_CN"; break; /* case WNNSERVER_T: strcpy (langname, "zh_TW"); break; */ case WNNSERVER_K: langname = "ko_KR"; break; case -1: default: return Qnil; } /* #### This is extremely stupid. I'm sure these alloca() copies are unnecessary, but the old code went out of its way to do this. --ben */ CHECK_STRING (lname); EXTBYTE_STRING_TO_ALLOCA (LISP_STRING_TO_EXTERNAL (lname, Qnative), envname); if (NILP (hname)) hostname = ""; else { CHECK_STRING (hname); EXTBYTE_STRING_TO_ALLOCA (LISP_STRING_TO_EXTERNAL (hname, Qnative), hostname); } /* 97/4/16 jhod@po.iijnet.or.jp * libwnn uses SIGALRM, so we need to stop and start interrupts. */ stop_interrupts (); if (!(wnnfns_buf[snum] = jl_open_lang (envname, hostname, langname, 0, 0, 0, EGG_TIMEOUT))) { start_interrupts (); return Qnil; } if (!jl_isconnect (wnnfns_buf[snum])) { start_interrupts (); return Qnil; } wnnfns_env_norm[snum] = jl_env_get (wnnfns_buf[snum]); /* if (Vwnnenv_sticky == Qt) jl_env_sticky_e (wnnfns_env_norm[snum]); else jl_env_un_sticky_e (wnnfns_env_norm[snum]);*/ strcat (envname, "R"); if (!(wnnfns_env_rev[snum] = jl_connect_lang (envname, hostname, langname, 0, 0, 0, EGG_TIMEOUT))) { start_interrupts (); return Qnil; } /* if (Vwnnenv_sticky == Qt) jl_env_sticky_e (wnnfns_env_rev[snum]); else jl_env_un_sticky_e (wnnfns_env_rev[snum]);*/ start_interrupts (); return Qt; } DEFUN ("wnn-server-close", Fwnn_close, 0, 0, 0, /* Close the connection to jserver, Dictionary and frequency files are not saved. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (wnnfns_env_norm[snum]) { if (NILP (Vwnnenv_sticky)) jl_env_un_sticky_e (wnnfns_env_norm[snum]); else jl_env_sticky_e (wnnfns_env_norm[snum]); jl_disconnect (wnnfns_env_norm[snum]); } if (wnnfns_env_rev[snum]) { if (NILP (Vwnnenv_sticky)) jl_env_un_sticky_e (wnnfns_env_rev[snum]); else jl_env_sticky_e (wnnfns_env_rev[snum]); jl_disconnect (wnnfns_env_rev[snum]); } jl_env_set (wnnfns_buf[snum], 0); jl_close (wnnfns_buf[snum]); wnnfns_buf[snum] = (struct wnn_buf *) 0; wnnfns_env_norm[snum] = wnnfns_env_rev[snum] = (struct wnn_env *) 0; return Qt; } DEFUN ("wnn-server-dict-add", Fwnn_dict_add, 5, MANY, 0, /* Add dictionary specified by DICT-FILE-NAME, FREQ-FILE-NAME, PRIORITY, DICT-FILE-MODE, FREQ-FILE-MODE. Specify password files of dictionary and frequency, PW1 and PW2, if needed. */ (int nargs, Lisp_Object *args)) { struct gcpro gcpro1; int snum; CHECK_STRING (args[0]); CHECK_STRING (args[1]); CHECK_FIXNUM (args[2]); if (! NILP (args[5])) CHECK_STRING (args[5]); if (! NILP (args[6])) CHECK_STRING (args[6]); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; GCPRO1 (*args); gcpro1.nvars = nargs; if (jl_dic_add (wnnfns_buf[snum], LISP_STRING_TO_EXTERNAL (args[0], Qfile_name), LISP_STRING_TO_EXTERNAL (args[1], Qfile_name), wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV, XFIXNUM (args[2]), NILP (args[3]) ? WNN_DIC_RDONLY : WNN_DIC_RW, NILP (args[4]) ? WNN_DIC_RDONLY : WNN_DIC_RW, NILP (args[5]) ? 0 : LISP_STRING_TO_EXTERNAL (args[5], Qfile_name), NILP (args[6]) ? 0 : LISP_STRING_TO_EXTERNAL (args[6], Qfile_name), yes_or_no, puts2 ) < 0) { UNGCPRO; return Qnil; } UNGCPRO; return Qt; } DEFUN ("wnn-server-dict-delete", Fwnn_dict_delete, 1, 1, 0, /* Remove dictionary specified by DIC-NUMBER from buffer. */ (dicno)) { int no; int snum; CHECK_FIXNUM (dicno); if ((snum = check_wnn_server_type ()) == -1) return Qnil; no = XFIXNUM (dicno); if (!wnnfns_buf[snum]) return Qnil; if (jl_dic_delete (wnnfns_buf[snum], no) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-dict-list", Fwnn_dict_list, 0, 0, 0, /* Return information of dictionaries. */ ()) { WNN_DIC_INFO *dicinfo; int cnt, i; Ibyte comment[1024]; Lisp_Object val; int snum; Lisp_Object charset; if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; #ifdef WNN6 if((cnt = jl_fi_dic_list (wnnfns_buf[snum], 0x3f, &dicinfo)) < 0) return Qnil; #else if((cnt = jl_dic_list (wnnfns_buf[snum], &dicinfo)) < 0) return Qnil; #endif val = Qnil; for (i = 0, dicinfo += cnt; i < cnt; i++) { dicinfo--; w2m (dicinfo->comment, comment, charset); val = Fcons (Fcons (make_fixnum (dicinfo->dic_no), list4 (build_extstring (dicinfo->fname, Qfile_name), build_istring (comment), make_fixnum (dicinfo->gosuu), make_fixnum (dicinfo->nice))), val); } return val; } DEFUN ("wnn-server-dict-comment", Fwnn_dict_comment, 2, 2, 0, /* Set comment to dictionary specified by DIC-NUMBER. Comment string COMMENT. */ (dicno, comment)) { w_char wbuf[512]; int snum; CHECK_FIXNUM (dicno); CHECK_STRING (comment); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; m2w (XSTRING_DATA (comment), wbuf); if (jl_dic_comment_set (wnnfns_buf[snum], XFIXNUM (dicno), wbuf) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-rev", Fwnn_set_rev, 1, 1, 0, /* Switch the translation mode to normal if T, or reverse if NIL. */ (rev)) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (NILP (rev)) { if ((!wnnfns_buf[snum]) || (!wnnfns_env_norm[snum])) return Qnil; jl_env_set (wnnfns_buf[snum], wnnfns_env_norm[snum]); wnnfns_norm = 1; } else { if ((!wnnfns_buf[snum]) || (!wnnfns_env_rev[snum])) return Qnil; jl_env_set (wnnfns_buf[snum], wnnfns_env_rev[snum]); wnnfns_norm = 0; } return Qt; } DEFUN ("wnn-server-henkan-begin", Fwnn_begin_henkan, 1, 1, 0, /* Translate YOMI string to kanji. Retuen the number of bunsetsu. */ (hstring)) { int cnt; w_char wbuf[5000]; int snum; CHECK_STRING (hstring); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; m2w (XSTRING_DATA (hstring), wbuf); if (snum == WNNSERVER_C) w2y (wbuf); #ifdef WNN6 if ((cnt = jl_fi_ren_conv (wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0) return Qnil; #else if ((cnt = jl_ren_conv (wnnfns_buf[snum], wbuf, 0, -1, WNN_USE_MAE)) < 0) return Qnil; #endif return make_fixnum (cnt); } DEFUN ("wnn-server-zenkouho", Fwnn_zenkouho, 2, 2, 0, /* Get zenkouho at BUNSETSU-NUMBER. Second argument DAI is t. if dai-bunsetsu, NIL if sho-bunsetsu. Return the current offset of zenkouho. */ (bunNo, dai)) { int no, offset; int snum; int uniq_level; CHECK_FIXNUM (bunNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; no = XFIXNUM (bunNo); if (EQ(Vwnn_uniq_level, Qwnn_no_uniq)) uniq_level = WNN_NO_UNIQ; else if (EQ(Vwnn_uniq_level, Qwnn_uniq)) uniq_level = WNN_UNIQ; else uniq_level = WNN_UNIQ_KNJ; if (NILP (dai)) { if ((offset = jl_zenkouho (wnnfns_buf[snum],no,WNN_USE_MAE, uniq_level)) < 0) return Qnil; } else { if ((offset = jl_zenkouho_dai (wnnfns_buf[snum], no, dai_end (no, snum), WNN_USE_MAE, uniq_level)) < 0) return Qnil; } return make_fixnum (offset); } DEFUN ("wnn-server-get-zenkouho", Fwnn_get_zenkouho, 1, 1, 0, /* Get kanji string of KOUHO-NUMBER. */ (kouhoNo)) { Ibyte kanji_buf[256]; w_char wbuf[256]; int snum; Lisp_Object charset; CHECK_FIXNUM (kouhoNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; jl_get_zenkouho_kanji (wnnfns_buf[snum], XFIXNUM (kouhoNo), wbuf); w2m (wbuf, kanji_buf, charset); return build_istring (kanji_buf); } DEFUN ("wnn-server-zenkouho-bun", Fwnn_zenkouho_bun, 0, 0, 0, /* For Wnn. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; return make_fixnum (jl_zenkouho_bun (wnnfns_buf[snum])); } DEFUN ("wnn-server-zenkouho-suu", Fwnn_zenkouho_suu, 0, 0, 0, /* Return the number of zen kouho. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; return make_fixnum (jl_zenkouho_suu (wnnfns_buf[snum])); } DEFUN ("wnn-server-dai-top", Fwnn_dai_top, 1, 1, 0, /* Return t if bunsetsu BUN-NUMBER is dai-bunsetsu. */ (bunNo)) { int snum; CHECK_FIXNUM (bunNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_dai_top (wnnfns_buf[snum], XFIXNUM (bunNo)) == 1) return Qt; else return Qnil; } DEFUN ("wnn-server-dai-end", Fwnn_dai_end, 1, 1, 0, /* Return the bunsetu number of the next dai-bunsetsu after BUN-NUMBER. */ (bunNo)) { int snum; CHECK_FIXNUM (bunNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; return make_fixnum (dai_end (XFIXNUM (bunNo), snum)); } DEFUN ("wnn-server-henkan-kakutei", Fwnn_kakutei, 2, 2, 0, /* Set candidate with OFFSET, DAI. DAI is T if dai-bunsetsu. */ (offset, dai)) { int snum; CHECK_FIXNUM (offset); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (NILP (dai)) { if (jl_set_jikouho (wnnfns_buf[snum], XFIXNUM (offset)) < 0) return Qnil; } else { if (jl_set_jikouho_dai (wnnfns_buf[snum], XFIXNUM (offset)) < 0) return Qnil; } return Qt; } DEFUN ("wnn-server-bunsetu-henkou", Fwnn_bunsetu_henkou, 3, 3, 0, /* Change length of BUN-NUMBER bunsetu to LEN. DAI is T if dai-bunsetsu. */ (bunNo, len, dai)) { int cnt, no; int snum; CHECK_FIXNUM (bunNo); CHECK_FIXNUM (len); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; no = XFIXNUM (bunNo); #ifdef WNN6 if ((cnt = jl_fi_nobi_conv (wnnfns_buf[snum], no, XFIXNUM(len), -1, WNN_USE_MAE, NILP (dai) ? WNN_SHO : WNN_DAI)) < 0) return Qnil; #else if ((cnt = jl_nobi_conv (wnnfns_buf[snum], no, XFIXNUM(len), -1, WNN_USE_MAE, NILP (dai) ? WNN_SHO : WNN_DAI)) < 0) return Qnil; #endif return make_fixnum (cnt); } DEFUN ("wnn-server-inspect", Fwnn_inspect, 1, 1, 0, /* Get bunsetsu information specified by BUN-NUMBER. */ (bunNo)) { Lisp_Object val; Ibyte cbuf[512]; w_char wbuf[256]; int bun_no, yomilen, jirilen, i; int snum; Lisp_Object charset; CHECK_FIXNUM (bunNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; bun_no = XFIXNUM (bunNo); val = Qnil; val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->kangovect), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->daihyoka), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->hyoka), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->ima), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->hindo), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->hinsi), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->entry), val); val = Fcons (make_fixnum (wnnfns_buf[snum]->bun[bun_no]->dic_no), val); yomilen = jl_get_yomi (wnnfns_buf[snum], bun_no, bun_no + 1, wbuf); jirilen = wnnfns_buf[snum]->bun[bun_no]->jirilen; for (i = yomilen; i >= jirilen; i--) wbuf[i+1] = wbuf[i]; wbuf[jirilen] = '+'; w2m (wbuf, cbuf, charset); val = Fcons (build_istring (cbuf), val); jl_get_kanji (wnnfns_buf[snum], bun_no, bun_no + 1, wbuf); w2m (wbuf, cbuf, charset); return Fcons (build_istring (cbuf), val); } DEFUN ("wnn-server-henkan-quit", Fwnn_quit_henkan, 0, 0, 0, /* do nothing. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; return Qt; } DEFUN ("wnn-server-bunsetu-kanji", Fwnn_bunsetu_kanji, 1, 1, 0, /* Get the pair of kanji and length of bunsetsu specified by BUN-NUMBER. */ (bunNo)) { int no; Ibyte kanji_buf[256]; w_char wbuf[256]; int kanji_len; int snum; Lisp_Object charset; CHECK_FIXNUM (bunNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; no = XFIXNUM (bunNo); kanji_len = jl_get_kanji (wnnfns_buf[snum], no, no + 1, wbuf); w2m (wbuf, kanji_buf, charset); return Fcons (build_istring (kanji_buf), make_fixnum (kanji_len)); } DEFUN ("wnn-server-bunsetu-yomi", Fwnn_bunsetu_yomi, 1, 1, 0, /* Get the pair of yomi and length of bunsetsu specified by BUN-NUMBER. */ (bunNo)) { int no; Ibyte yomi_buf[256]; w_char wbuf[256]; int yomi_len; int snum; Lisp_Object charset; CHECK_FIXNUM (bunNo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; no = XFIXNUM (bunNo); yomi_len = jl_get_yomi (wnnfns_buf[snum], no, no + 1, wbuf); w2m (wbuf, yomi_buf, charset); return Fcons (build_istring (yomi_buf), make_fixnum (yomi_len)); } DEFUN ("wnn-server-bunsetu-suu", Fwnn_bunsetu_suu, 0, 0, 0, /* Get the number of bunsetsu. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; return make_fixnum (jl_bun_suu (wnnfns_buf[snum])); } DEFUN ("wnn-server-hindo-update", Fwnn_hindo_update, 0, 1, 0, /* Update frequency of bunsetsu specified by NUM-NUMBER. */ (bunNo)) { int no; int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (NILP (bunNo)) no = -1; else { CHECK_FIXNUM (bunNo); no = XFIXNUM (bunNo); } if (!wnnfns_buf[snum]) return Qnil; #ifdef WNN6 if (jl_optimize_fi (wnnfns_buf[snum], 0, no) < 0) return Qnil; #else if (jl_update_hindo (wnnfns_buf[snum], 0, no) < 0) return Qnil; #endif return Qt; } DEFUN ("wnn-server-word-add", Fwnn_word_toroku, 5, 5, 0, /* Add a word to dictionary. Arguments are DIC-NUMBER, KANJI, YOMI, COMMENT, HINSI-NUMBER. */ (dicno, kanji, yomi, comment, hinsi)) { w_char yomi_buf[256], kanji_buf[256], comment_buf[256]; int snum; CHECK_FIXNUM (dicno); CHECK_STRING (kanji); CHECK_STRING (yomi); CHECK_STRING (comment); CHECK_FIXNUM (hinsi); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; m2w (XSTRING_DATA (yomi), yomi_buf); if (snum == WNNSERVER_C) w2y (yomi_buf); m2w (XSTRING_DATA (kanji), kanji_buf); m2w (XSTRING_DATA (comment), comment_buf); if (jl_word_add (wnnfns_buf[snum], XFIXNUM (dicno), yomi_buf, kanji_buf, comment_buf, XFIXNUM (hinsi), 0) < 0) return Qnil; else return Qt; } DEFUN ("wnn-server-word-delete", Fwnn_word_sakujo, 2, 2, 0, /* Delete a word from dictionary, specified by DIC-NUMBER, SERIAL-NUMBER. */ (no, serial)) { int snum; CHECK_FIXNUM (no); CHECK_FIXNUM (serial); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_word_delete (wnnfns_buf[snum], XFIXNUM (no), XFIXNUM (serial)) < 0) return Qnil; else return Qt; } DEFUN ("wnn-server-word-use", Fwnn_word_use, 2, 2, 0, /* Toggle on/off word, specified by DIC-NUMBER and SERIAL-NUMBER. */ (no, serial)) { int snum; CHECK_FIXNUM (no); CHECK_FIXNUM (serial); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_word_use (wnnfns_buf[snum], XFIXNUM (no), XFIXNUM (serial)) < 0) return Qnil; else return Qt; } DEFUN ("wnn-server-word-info", Fwnn_word_info, 2, 2, 0, /* Return list of yomi, kanji, comment, hindo, hinshi. */ (no, serial)) { Lisp_Object val; struct wnn_jdata *info_buf; Ibyte cbuf[512]; int snum; Lisp_Object charset; CHECK_FIXNUM (no); CHECK_FIXNUM (serial); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; if ((info_buf = jl_word_info (wnnfns_buf[snum], XFIXNUM (no), XFIXNUM (serial))) != NULL) { return Qnil; } else { val = Qnil; val = Fcons (make_fixnum (info_buf->hinshi), val); val = Fcons (make_fixnum (info_buf->hindo), val); w2m (info_buf->com, cbuf, charset); val = Fcons (build_istring (cbuf), val); w2m (info_buf->kanji, cbuf, charset); val = Fcons (build_istring (cbuf), val); w2m (info_buf->yomi, cbuf, charset); val = Fcons (build_istring (cbuf), val); return val; } } DEFUN ("wnn-server-word-hindo-set", Fwnn_hindo_set, 3, 3, 0, /* Set frequency to arbitrary value. Specified by DIC-NUMBER, SERIAL-NUMBER, FREQUENCY. */ (no, serial, hindo)) { int snum; CHECK_FIXNUM (no); CHECK_FIXNUM (serial); CHECK_FIXNUM (hindo); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (js_hindo_set (jl_env_get (wnnfns_buf[snum]), XFIXNUM (no), XFIXNUM (serial), WNN_HINDO_NOP, XFIXNUM (hindo)) < 0) return Qnil; else return Qt; } DEFUN ("wnn-server-word-search", Fwnn_dict_search, 1, 1, 0, /* Search a word YOMI from buffer. Return list of (kanji hinshi freq dic_no serial). */ (yomi)) { Lisp_Object val; struct wnn_jdata *wordinfo; int i, count; w_char wbuf[256]; Ibyte kanji_buf[256]; int snum; Lisp_Object charset; CHECK_STRING (yomi); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; m2w (XSTRING_DATA (yomi), wbuf); if (snum == WNNSERVER_C) w2y (wbuf); if ((count = jl_word_search_by_env (wnnfns_buf[snum], wbuf, &wordinfo)) < 0) return Qnil; val = Qnil; for (i = 0, wordinfo += count; i < count; i++) { wordinfo--; w2m (wordinfo->kanji, kanji_buf, charset); val = Fcons (Fcons (build_istring (kanji_buf), list4 (make_fixnum (wordinfo->hinshi), make_fixnum (wordinfo->hindo), make_fixnum (wordinfo->dic_no), make_fixnum (wordinfo->serial))), val); } return val; } DEFUN ("wnn-server-dict-save", Fwnn_dict_save, 0, 0, 0, /* Save all dictionaries and frequency files. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_dic_save_all (wnnfns_buf[snum]) < 0) return Qnil; else return Qt; } DEFUN ("wnn-server-get-param", Fwnn_get_param, 0, 0, 0, /* Returns (n nsho hindo len jiri flag jisho sbn dbn_len sbn_cnt suuji kana eisuu kigou toji_kakko fuzokogo kaikakko) */ ()) { struct wnn_param param; int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_param_get (wnnfns_buf[snum], ¶m) < 0) return Qnil; return Fcons (make_fixnum (param.n), Fcons (make_fixnum (param.nsho), Fcons (make_fixnum (param.p1), Fcons (make_fixnum (param.p2), Fcons (make_fixnum (param.p3), Fcons (make_fixnum (param.p4), Fcons (make_fixnum (param.p5), Fcons (make_fixnum (param.p6), Fcons (make_fixnum (param.p7), Fcons (make_fixnum (param.p8), Fcons (make_fixnum (param.p9), Fcons (make_fixnum (param.p10), Fcons (make_fixnum (param.p11), Fcons (make_fixnum (param.p12), Fcons (make_fixnum (param.p13), Fcons (make_fixnum (param.p14), Fcons (make_fixnum (param.p15),Qnil))))))))))))))))); } DEFUN ("wnn-server-set-param", Fwnn_set_param, 1, 1, 0, /* Set parameters using an alist, where the CAR contains one of wnn_n, wnn_nsho, wnn_hindo, wnn_len, wnn_jiri, wnn_flag, wnn_jisho, wnn_sbn, wnn_dbn_len, wnn_sbn_cnt, wnn_suuji, wnn_kana, wnn_eisuu, wnn_kigou, wnn_toji_kakko, wnn_fuzokogo, or wnn_kaikakko and the CDR contains the value. */ (Vsetvalues_alist)) { int rc; struct wnn_param param; int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; rc = jl_param_get (wnnfns_buf[snum], ¶m); if (rc < 0) return Qnil; { EXTERNAL_PROPERTY_LIST_LOOP_3 (key, val, Vsetvalues_alist) { int setval; CHECK_FIXNUM (val); setval = XFIXNUM (val); if (EQ (key, Qwnn_n)) param.n = setval; else if (EQ (key, Qwnn_nsho)) param.nsho = setval; else if (EQ (key, Qwnn_hindo)) param.p1 = setval; else if (EQ (key, Qwnn_len)) param.p2 = setval; else if (EQ (key, Qwnn_jiri)) param.p3 = setval; else if (EQ (key, Qwnn_flag)) param.p4 = setval; else if (EQ (key, Qwnn_jisho)) param.p5 = setval; else if (EQ (key, Qwnn_sbn)) param.p6 = setval; else if (EQ (key, Qwnn_dbn_len)) param.p7 = setval; else if (EQ (key, Qwnn_sbn_cnt)) param.p8 = setval; else if (EQ (key, Qwnn_suuji)) param.p9 = setval; else if (EQ (key, Qwnn_kana)) param.p10 = setval; else if (EQ (key, Qwnn_eisuu)) param.p11 = setval; else if (EQ (key, Qwnn_kigou)) param.p12 = setval; else if (EQ (key, Qwnn_toji_kakko)) param.p13 = setval; else if (EQ (key, Qwnn_fuzokogo)) param.p14 = setval; else if (EQ (key, Qwnn_kaikakko)) param.p15 = setval; else { invalid_constant ("Invalid wnn keyword", key); return Qnil; } } } #if 0 printf("wnn_n = %d\n",param.n); printf("wnn_nsho = %d\n",param.nsho); printf("wnn_hindo = %d\n",param.p1); printf("wnn_len = %d\n",param.p2); printf("wnn_jiri = %d\n",param.p3); printf("wnn_flag = %d\n",param.p4); printf("wnn_jisho = %d\n",param.p5); printf("wnn_sbn = %d\n",param.p6); printf("wnn_dbn_len = %d\n",param.p7); printf("wnn_sbn_cnt = %d\n",param.p8); printf("wnn_suuji = %d\n",param.p9); printf("wnn_kana = %d\n",param.p10); printf("wnn_eisuu = %d\n",param.p11); printf("wnn_kigou = %d\n",param.p12); printf("wnn_toji_kakko = %d\n",param.p13); printf("wnn_fuzokogo = %d\n",param.p14); printf("wnn_kaikakko = %d\n",param.p15); #endif rc = jl_param_set (wnnfns_buf[snum], ¶m); if (rc < 0) return Qnil; return Qt; } DEFUN ("wnn-server-get-msg", Fwnn_get_msg, 0, 0, 0, /* Get message string from wnn_perror. */ ()) { Ibyte mbuf[256]; char *msgp; int snum; Lisp_Object charset; char langname[32]; /* CHECK_FIXNUM (errno);*/ if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; switch (snum) { case WNNSERVER_J: strcpy (langname, "ja_JP"); break; case WNNSERVER_C: strcpy (langname, "zh_CN"); break; /* case WNNSERVER_T: strcpy (langname, "zh_TW"); break; */ case WNNSERVER_K: strcpy (langname, "ko_KR"); break; } if (!wnnfns_buf[snum]) return Qnil; /* msgp = msg_get (wnn_msg_cat, XFIXNUM (errno), 0, 0);*/ msgp = wnn_perror_lang (langname); c2m ((UExtbyte *) msgp, mbuf, charset); return build_istring (mbuf); } DEFUN ("wnn-server-fuzokugo-set", Fwnn_fuzokugo_set, 1, 1, 0, /* For Wnn. */ (file)) { int snum; CHECK_STRING (file); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_fuzokugo_set (wnnfns_buf[snum], LISP_STRING_TO_EXTERNAL (file, Qfile_name)) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-fuzokugo-get", Fwnn_fuzokugo_get, 0, 0, 0, /* For Wnn. */ ()) { char fname[256]; int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_fuzokugo_get (wnnfns_buf[snum], fname) < 0) return Qnil; return build_extstring (fname, Qfile_name); } DEFUN ("wnn-server-isconnect", Fwnn_isconnect, 0, 0, 0, /* For Wnn. */ ()) { int snum; if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if (jl_isconnect (wnnfns_buf[snum])) return Qt; else return Qnil; } DEFUN ("wnn-server-hinsi-dicts", Fwnn_hinsi_dicts, 1, 1, 0, /* For Wnn. */ (hinsi)) { int *area; int cnt; Lisp_Object val; int snum; CHECK_FIXNUM (hinsi); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; if ((cnt = jl_hinsi_dicts (wnnfns_buf[snum], XFIXNUM (hinsi), &area)) < 0) return Qnil; val = Qnil; for (area += cnt; cnt > 0; cnt--) { area--; val = Fcons (make_fixnum (*area), val); } return val; } DEFUN ("wnn-server-hinsi-list", Fwnn_hinsi_list, 2, 2, 0, /* For Wnn. */ (dicno, name)) { int cnt; Lisp_Object val; w_char wbuf[256]; w_char **area; Ibyte cbuf[512]; int snum; Lisp_Object charset; CHECK_FIXNUM (dicno); CHECK_STRING (name); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; m2w (XSTRING_DATA (name), wbuf); if ((cnt = jl_hinsi_list (wnnfns_buf[snum], XFIXNUM (dicno), wbuf, &area)) < 0) return Qnil; if (cnt == 0) return make_fixnum (0); val = Qnil; for (area += cnt; cnt > 0; cnt--) { area--; w2m (*area, cbuf, charset); val = Fcons (build_istring (cbuf), val); } return val; } DEFUN ("wnn-server-hinsi-name", Fwnn_hinsi_name, 1, 1, 0, /* For Wnn. */ (no)) { Ibyte name[256]; w_char *wname; int snum; Lisp_Object charset; CHECK_FIXNUM (no); if ((snum = check_wnn_server_type ()) == -1) return Qnil; charset = charset_wnn_server_type[snum]; if (!wnnfns_buf[snum]) return Qnil; if ((wname = jl_hinsi_name (wnnfns_buf[snum], XFIXNUM (no))) == 0) return Qnil; w2m (wname, name, charset); return build_istring (name); } #ifdef WNN6 DEFUN ("wnn-server-fisys-dict-add", Fwnn_fisys_dict_add, 3, MANY, 0, /* Add dictionary specified by FISYS-DICT-FILE-NAME, FISYS-FREQ-FILE-NAME, FISYS-FREQ-FILE-MODE. Specify password files of dictionary and frequency, PW1 and PW2, if needed. */ (int nargs, Lisp_Object *args)) { struct gcpro gcpro1; int snum; CHECK_STRING (args[0]); CHECK_STRING (args[1]); if (!NILP (args[3])) CHECK_STRING (args[3]); if ((snum = check_wnn_server_type()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; GCPRO1 (*args); gcpro1.nvars = nargs; if (jl_fi_dic_add (wnnfns_buf[snum], LISP_STRING_TO_EXTERNAL (args[0], Qfile_name), LISP_STRING_TO_EXTERNAL (args[1], Qfile_name), WNN_FI_SYSTEM_DICT, WNN_DIC_RDONLY, NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW, 0, NILP (args[3]) ? 0 : LISP_STRING_TO_EXTERNAL (args[3], Qfile_name), yes_or_no, puts2) < 0) { UNGCPRO; return Qnil; } UNGCPRO; return Qt; } DEFUN ("wnn-server-fiusr-dict-add", Fwnn_fiusr_dict_add, 4, MANY, 0, /* Add dictionary specified by FIUSR-DICT-FILE-NAME, FIUSR-FREQ-FILE-NAME, FIUSR-DICT-FILE-MODE, FIUSR-FREQ-FILE-MODE. Specify password files of dictionary and frequency, PW1 and PW2, if needed. */ (int nargs, Lisp_Object *args)) { struct gcpro gcpro1; int snum; CHECK_STRING (args[0]); CHECK_STRING (args[1]); if (!NILP (args[4])) CHECK_STRING (args[4]); if (!NILP (args[5])) CHECK_STRING (args[5]); if ((snum = check_wnn_server_type()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; GCPRO1 (*args); gcpro1.nvars = nargs; if (jl_fi_dic_add (wnnfns_buf[snum], LISP_STRING_TO_EXTERNAL (args[0], Qfile_name), LISP_STRING_TO_EXTERNAL (args[1], Qfile_name), WNN_FI_USER_DICT, NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW, NILP (args[3]) ? WNN_DIC_RDONLY : WNN_DIC_RW, NILP (args[4]) ? 0 : LISP_STRING_TO_EXTERNAL (args[4], Qfile_name), NILP (args[5]) ? 0 : LISP_STRING_TO_EXTERNAL (args[5], Qfile_name), yes_or_no, puts2) < 0) { UNGCPRO; return Qnil; } UNGCPRO; return Qt; } DEFUN ("wnn-server-notrans-dict-add", Fwnn_notrans_dict_add, 3, MANY, 0, /* Add dictionary specified by NOTRANS-DICT-FILE-NAME, PRIORITY, DICT-FILE-MODE. Specify password files of dictionary and frequency PW1 if needed. */ (int nargs, Lisp_Object *args)) { struct gcpro gcpro1; int snum; int dic_no; struct wnn_env *cur_env; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_STRING (args[0]); CHECK_FIXNUM (args[1]); if (! NILP (args[3])) CHECK_STRING (args[3]); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; GCPRO1 (*args); gcpro1.nvars = nargs; if(wnnfns_norm) cur_env = wnnfns_env_norm[snum]; else cur_env = wnnfns_env_rev[snum]; dic_no = js_get_autolearning_dic(cur_env, WNN_MUHENKAN_LEARNING); if (dic_no == WNN_NO_LEARNING) { if ((dic_no = jl_dic_add (wnnfns_buf[snum], LISP_STRING_TO_EXTERNAL (args[0], Qfile_name), 0, wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV, XFIXNUM (args[1]), WNN_DIC_RW, WNN_DIC_RW, NILP (args[3]) ? 0 : LISP_STRING_TO_EXTERNAL (args[3], Qfile_name), 0, yes_or_no, puts2)) < 0) { UNGCPRO; return Qnil; } js_set_autolearning_dic (cur_env, WNN_MUHENKAN_LEARNING, dic_no); } if (!js_is_loaded_temporary_dic (cur_env)) { if (js_temporary_dic_add (cur_env, wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV) < 0) { UNGCPRO; return Qnil; } } vmask |= WNN_ENV_MUHENKAN_LEARN_MASK; henv.muhenkan_flag = NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW; if (jl_set_henkan_env (wnnfns_buf[snum], vmask, &henv) < 0) { UNGCPRO; return Qnil; } UNGCPRO; return Qt; } DEFUN ("wnn-server-bmodify-dict-add", Fwnn_bmodify_dict_add, 3, MANY, 0, /* Add dictionary specified by BMODIFY-DICT-FILE-NAME, PRIORITY, DICT-FILE-MODE. Specify password files of dictionary and frequency PW1 if needed. */ (int nargs, Lisp_Object *args)) { struct gcpro gcpro1; int snum; int dic_no; struct wnn_env *cur_env; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_STRING (args[0]); CHECK_FIXNUM (args[1]); if (! NILP (args[3])) CHECK_STRING (args[3]); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; GCPRO1 (*args); gcpro1.nvars = nargs; if(wnnfns_norm) cur_env = wnnfns_env_norm[snum]; else cur_env = wnnfns_env_rev[snum]; dic_no = js_get_autolearning_dic(cur_env, WNN_BUNSETSUGIRI_LEARNING); if (dic_no == WNN_NO_LEARNING) { if ((dic_no = jl_dic_add (wnnfns_buf[snum], LISP_STRING_TO_EXTERNAL (args[0], Qfile_name), 0, wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV, XFIXNUM(args[1]), WNN_DIC_RW, WNN_DIC_RW, NILP (args[3]) ? 0 : LISP_STRING_TO_EXTERNAL (args[3], Qfile_name), 0, yes_or_no, puts2)) < 0) { UNGCPRO; return Qnil; } js_set_autolearning_dic (cur_env, WNN_BUNSETSUGIRI_LEARNING, dic_no); } if (!js_is_loaded_temporary_dic (cur_env)) { if (js_temporary_dic_add (cur_env, wnnfns_norm ? WNN_DIC_ADD_NOR : WNN_DIC_ADD_REV) < 0) { UNGCPRO; return Qnil; } } vmask |= WNN_ENV_BUNSETSUGIRI_LEARN_MASK; henv.bunsetsugiri_flag = NILP (args[2]) ? WNN_DIC_RDONLY : WNN_DIC_RW; if (jl_set_henkan_env (wnnfns_buf[snum], vmask, &henv) < 0) { UNGCPRO; return Qnil; } UNGCPRO; return Qt; } DEFUN ("wnn-server-set-last-is-first", Fwnn_last_is_first, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_LAST_IS_FIRST_MASK; henv.last_is_first_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-complex-conv-mode", Fwnn_complex_conv, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_COMPLEX_CONV_MASK; henv.complex_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-okuri-learn-mode", Fwnn_okuri_learn, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_OKURI_LEARN_MASK; henv.okuri_learn_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-okuri-flag", Fwnn_okuri_flag, 1, 1, 0, /* For FI-Wnn. */ (lmode)) { int snum, mode; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_FIXNUM (lmode); mode = XFIXNUM (lmode); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(mode != WNN_OKURI_REGULATION && mode != WNN_OKURI_NO && mode != WNN_OKURI_YES) return Qnil; else henv.okuri_flag = mode; vmask |= WNN_ENV_OKURI_MASK; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-prefix-learn-mode", Fwnn_prefix_learn, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_PREFIX_LEARN_MASK; henv.prefix_learn_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-prefix-flag", Fwnn_prefix_flag, 1, 1, 0, /* For FI-Wnn. */ (lmode)) { int snum, mode; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_FIXNUM (lmode); mode = XFIXNUM (lmode); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(mode != WNN_KANA_KOUHO && mode != WNN_KANJI_KOUHO) return Qnil; else henv.prefix_flag = mode; vmask |= WNN_ENV_PREFIX_MASK; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-suffix-learn-mode", Fwnn_suffix_learn, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_SUFFIX_LEARN_MASK; henv.suffix_learn_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-common-learn-mode", Fwnn_common_learn, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_COMMON_LAERN_MASK; henv.common_learn_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-freq-func-mode", Fwnn_freq_func, 1, 1, 0, /* For FI-Wnn. */ (lmode)) { int snum, mode; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_FIXNUM (lmode); mode = XFIXNUM (lmode); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(mode != 0 && mode != 1 && mode != 2 && mode != 3 && mode != 4) return Qnil; else henv.freq_func_flag = mode; vmask |= WNN_ENV_FREQ_FUNC_MASK; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-numeric-mode", Fwnn_numeric, 1, 1, 0, /* For FI-Wnn. */ (lmode)) { int snum, mode; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_FIXNUM (lmode); mode = XFIXNUM (lmode); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(mode != WNN_NUM_KANSUUJI && mode != WNN_NUM_KANOLD && mode != WNN_NUM_HANCAN && mode != WNN_NUM_ZENCAN && mode != WNN_NUM_HAN && mode != WNN_NUM_ZEN && mode != WNN_NUM_KAN) return Qnil; else henv.numeric_flag = mode; vmask |= WNN_ENV_NUMERIC_MASK; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-alphabet-mode", Fwnn_alphabet, 1, 1, 0, /* For FI-Wnn. */ (lmode)) { int snum, mode; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_FIXNUM (lmode); mode = XFIXNUM (lmode); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(mode != WNN_ALP_HAN && mode != WNN_ALP_ZEN) return Qnil; else henv.alphabet_flag = mode; vmask |= WNN_ENV_ALPHABET_MASK; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-symbol-mode", Fwnn_symbol, 1, 1, 0, /* For FI-Wnn. */ (lmode)) { int snum, mode; unsigned long vmask = 0; struct wnn_henkan_env henv; CHECK_FIXNUM (lmode); mode = XFIXNUM (lmode); if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(mode != WNN_KIG_HAN && mode != WNN_KIG_JIS && mode != WNN_KIG_ASC) return Qnil; else henv.symbol_flag = mode; vmask |= WNN_ENV_SYMBOL_MASK; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-server-set-yuragi-mode", Fwnn_yuragi, 1, 1, 0, /* For FI-Wnn. */ (mode)) { int snum; unsigned long vmask = 0; struct wnn_henkan_env henv; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; vmask |= WNN_ENV_YURAGI_MASK; henv.yuragi_flag = NILP (mode) ? False : True; if(jl_set_henkan_env(wnnfns_buf[snum], vmask, &henv) < 0) return Qnil; return Qt; } DEFUN ("wnn-reset-previous-info", Fwnn_reset_prev, 0, 0, 0, /* For FI-Wnn. */ ()) { int snum; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(jl_reset_prev_bun(wnnfns_buf[snum]) < 0) return Qnil; return Qt; } #endif /* Wnn6 */ DEFUN ("wnn-server-version", Fwnn_version, 0, 0, 0, /* Returns Wnn server version ID. */ ()) { int snum; int serv; int libv; struct wnn_env *cur_env; if ((snum = check_wnn_server_type()) == -1) return Qnil; if(!wnnfns_buf[snum]) return Qnil; if(wnnfns_norm) cur_env = wnnfns_env_norm[snum]; else cur_env = wnnfns_env_rev[snum]; if(js_version (cur_env->js_id,&serv,&libv) < 0) return Qnil; return make_fixnum (serv); } DEFUN ("wnn-server-hinsi-number", Fwnn_hinsi_number, 1, 1, 0, /* For Wnn. */ (name)) { w_char w_buf[256]; int no; int snum; CHECK_STRING (name); if ((snum = check_wnn_server_type ()) == -1) return Qnil; if (!wnnfns_buf[snum]) return Qnil; m2w (XSTRING_DATA (name), w_buf); if ((no = jl_hinsi_number (wnnfns_buf[snum], w_buf)) < 0) return Qnil; return make_fixnum (no); } void syms_of_mule_wnn (void) { DEFSUBR (Fwnn_open); DEFSUBR (Fwnn_close); DEFSUBR (Fwnn_dict_add); DEFSUBR (Fwnn_dict_delete); DEFSUBR (Fwnn_dict_list); DEFSUBR (Fwnn_dict_comment); DEFSUBR (Fwnn_set_rev); DEFSUBR (Fwnn_begin_henkan); DEFSUBR (Fwnn_zenkouho); DEFSUBR (Fwnn_get_zenkouho); DEFSUBR (Fwnn_zenkouho_bun); DEFSUBR (Fwnn_zenkouho_suu); DEFSUBR (Fwnn_dai_top); DEFSUBR (Fwnn_dai_end); DEFSUBR (Fwnn_kakutei); DEFSUBR (Fwnn_bunsetu_henkou); DEFSUBR (Fwnn_inspect); DEFSUBR (Fwnn_quit_henkan); DEFSUBR (Fwnn_bunsetu_kanji); DEFSUBR (Fwnn_bunsetu_yomi); DEFSUBR (Fwnn_bunsetu_suu); DEFSUBR (Fwnn_hindo_update); DEFSUBR (Fwnn_word_toroku); DEFSUBR (Fwnn_word_sakujo); DEFSUBR (Fwnn_word_use); DEFSUBR (Fwnn_word_info); DEFSUBR (Fwnn_hindo_set); DEFSUBR (Fwnn_dict_search); DEFSUBR (Fwnn_dict_save); DEFSUBR (Fwnn_get_param); DEFSUBR (Fwnn_set_param); DEFSUBR (Fwnn_get_msg); DEFSUBR (Fwnn_fuzokugo_set); DEFSUBR (Fwnn_fuzokugo_get); DEFSUBR (Fwnn_isconnect); DEFSUBR (Fwnn_hinsi_dicts); DEFSUBR (Fwnn_hinsi_list); DEFSUBR (Fwnn_hinsi_name); DEFSUBR (Fwnn_hinsi_number); #ifdef WNN6 DEFSUBR (Fwnn_fisys_dict_add); DEFSUBR (Fwnn_fiusr_dict_add); DEFSUBR (Fwnn_notrans_dict_add); DEFSUBR (Fwnn_bmodify_dict_add); DEFSUBR (Fwnn_last_is_first); DEFSUBR (Fwnn_complex_conv); DEFSUBR (Fwnn_okuri_learn); DEFSUBR (Fwnn_okuri_flag); DEFSUBR (Fwnn_prefix_learn); DEFSUBR (Fwnn_prefix_flag); DEFSUBR (Fwnn_suffix_learn); DEFSUBR (Fwnn_common_learn); DEFSUBR (Fwnn_freq_func); DEFSUBR (Fwnn_numeric); DEFSUBR (Fwnn_alphabet); DEFSUBR (Fwnn_symbol); DEFSUBR (Fwnn_yuragi); DEFSUBR (Fwnn_reset_prev); #endif /* Wnn6 */ DEFSUBR (Fwnn_version); DEFSYMBOL (Qjserver); DEFSYMBOL (Qcserver); /* DEFSYMBOL (Qtserver); */ DEFSYMBOL (Qkserver); DEFSYMBOL (Qwnn_no_uniq); DEFSYMBOL (Qwnn_uniq); DEFSYMBOL (Qwnn_uniq_kanji); defsymbol (&Qwnn_n, "wnn_n"); defsymbol (&Qwnn_nsho, "wnn_nsho"); defsymbol (&Qwnn_hindo, "wnn_hindo"); defsymbol (&Qwnn_len, "wnn_len"); defsymbol (&Qwnn_jiri, "wnn_jiri"); defsymbol (&Qwnn_flag, "wnn_flag"); defsymbol (&Qwnn_jisho, "wnn_jisho"); defsymbol (&Qwnn_sbn, "wnn_sbn"); defsymbol (&Qwnn_dbn_len, "wnn_dbn_len"); defsymbol (&Qwnn_sbn_cnt, "wnn_sbn_cnt"); defsymbol (&Qwnn_suuji, "wnn_suuji"); defsymbol (&Qwnn_kana, "wnn_kana"); defsymbol (&Qwnn_eisuu, "wnn_eisuu"); defsymbol (&Qwnn_kigou, "wnn_kigou"); defsymbol (&Qwnn_toji_kakko, "wnn_toji_kakko"); defsymbol (&Qwnn_fuzokogo, "wnn_fuzokogo"); defsymbol (&Qwnn_kaikakko, "wnn_kaikakko"); } void reinit_vars_of_mule_wnn (void) { int i; for (i = 0; i < NSERVER; i++) { wnnfns_buf[i] = (struct wnn_buf *) 0; wnnfns_env_norm[i] = (struct wnn_env *) 0; wnnfns_env_rev[i] = (struct wnn_env *) 0; } charset_wnn_server_type[0] = Vcharset_japanese_jisx0208; charset_wnn_server_type[1] = Vcharset_chinese_gb2312; charset_wnn_server_type[2] = Vcharset_thai_tis620; charset_wnn_server_type[3] = Vcharset_korean_ksc5601; } void vars_of_mule_wnn (void) { DEFVAR_LISP ("wnn-server-type", &Vwnn_server_type /* *jserver, cserver .. */ ); DEFVAR_LISP ("cwnn-zhuyin", &Vcwnn_zhuyin /* *pinyin or zhuyin */ ); DEFVAR_LISP ("wnnenv-sticky", &Vwnnenv_sticky /* *If non-nil, make environment sticky */ ); DEFVAR_LISP ("wnn-uniq-level", &Vwnn_uniq_level /* *Uniq level */ ); Vwnn_server_type = Qjserver; Vcwnn_zhuyin = Qnil; Vwnnenv_sticky = Qnil; DEFSYMBOL (Qchinese_sisheng); Vwnn_uniq_level = Qwnn_uniq; Fprovide (intern ("wnn")); } /* Convert from the wide-char format expected for wnn to the XEmacs string format. */ void w2m (w_char *wp, Ibyte *mp, Lisp_Object charset) { w_char wc; w_char pzy[10]; int i, len; while ((wc = *wp++) != 0) { switch (wc & 0x8080) { case 0x80: if (EQ(Vwnn_server_type, Qcserver)) { len = cwnn_yincod_pzy (pzy, wc, NILP (Vcwnn_zhuyin) ? CWNN_PINYIN : CWNN_ZHUYIN); for (i = 0; i < len; i++) { if (pzy[i] & 0x80) mp += charset_codepoint_to_itext (Fget_charset (Qchinese_sisheng), 0, pzy[i] & 0x7f, mp, CONVERR_USE_PRIVATE); else /* @@#### Correct? */ mp += charset_codepoint_to_itext (Vcharset_ascii, 0, pzy[i] & 0x7f, mp, CONVERR_USE_PRIVATE); } } else mp += charset_codepoint_to_itext (Vcharset_katakana_jisx0201, 0, wc & 0x7f, mp, CONVERR_USE_PRIVATE); break; case 0x8080: mp += charset_codepoint_to_itext (charset, (wc & 0x7f00) >> 8, wc & 0x007f, mp, CONVERR_USE_PRIVATE); break; case 0x8000: { Lisp_Object newchar = charset; if (EQ (charset, Vcharset_japanese_jisx0208)) newchar = Vcharset_japanese_jisx0212; #ifndef UNICODE_INTERNAL /* @@#### Something very strange about this */ else if (EQ (charset, Vcharset_chinese_big5_1)) newchar = Vcharset_chinese_big5_2; #endif /* not UNICODE_INTERNAL */ mp += charset_codepoint_to_itext (newchar, (wc & 0x7f00) >> 8, wc & 0x007f, mp, CONVERR_USE_PRIVATE); break; } default: mp += set_itext_ichar (mp, wc & 0x00ff); break; } } *mp = 0; } /* Convert XEmacs string format to the wide-char format expected for wnn. */ void m2w (Ibyte *mp, w_char *wp) { while (*mp) { Lisp_Object charset; int c1, c2; int ch; /* @@#### current_buffer dependency */ buffer_itext_to_charset_codepoint (mp, current_buffer, &charset, &c1, &c2, CONVERR_FAIL); INC_IBYTEPTR (mp); if (EQ (charset, Vcharset_ascii) || EQ (charset, Vcharset_latin_jisx0201) || EQ (charset, Vcharset_katakana_jisx0201)) ch = c2; else if (EQ (charset, Vcharset_japanese_jisx0208) || EQ (charset, Vcharset_japanese_jisx0208_1978) || EQ (charset, Vcharset_chinese_gb2312) || EQ (charset, Vcharset_korean_ksc5601) /* || other 2-byte charsets??? */ ) ch = ((c1 | 0x80) << 8) + (c2 | 0x80); else if (EQ (charset, Vcharset_japanese_jisx0212)) ch = ((c1 | 0x80) << 8) + c2; else if (EQ (charset, Fget_charset (Qchinese_sisheng))) ch = 0x8e80 | c2; else /* Ignore character */ continue; *wp++ = (w_char) ch; } *wp = 0; } void w2y (w_char *w) { letter pbuf[5000], ybuf[5000]; unsigned int *pin; w_char *y; int len; pin = pbuf; y = w; while (1) { if (*w == 0) {*pin =0; break;} else *pin = *w; w++; pin++; } len = cwnn_pzy_yincod (ybuf, pbuf, NILP (Vcwnn_zhuyin) ? CWNN_PINYIN : CWNN_ZHUYIN); if (len <= 0) return; pin = ybuf; while (1) { if (*pin == 0 || len == 0) {*y = 0;break;} *y = *pin; y++; pin++; len--; } } /* Converts text in the multi-byte locale-specific format returned by some WNN functions into XEmacs-internal. This format appears to be a simple MBCS encoding with a single locale, and we could use probably existing coding systems to handle it. */ void c2m (UExtbyte *cp, Ibyte *mp, Lisp_Object charset) { UExtbyte ch; while ((ch = *cp) != 0) { if (ch & 0x80) { mp += charset_codepoint_to_itext (charset, cp[0] & 0x7f, cp[1] & 0x7f, mp, CONVERR_USE_PRIVATE); cp += 2; } else *mp++ = *cp++; /* Guaranteed ASCII */ } *mp = 0; } static int dai_end (int no, int server) { for (no++; no < jl_bun_suu (wnnfns_buf[server]) && !jl_dai_top (wnnfns_buf[server], no); no++); return (no); } static int yes_or_no (UExtbyte *s) { Ibyte mbuf[512]; Lisp_Object charset; int len; int snum; if ((snum = check_wnn_server_type ()) == -1) return 0; charset = charset_wnn_server_type[snum]; /* if no message found, create file without query */ /* if (wnn_msg_cat->msg_bd == 0) return 1;*/ if (*s == 0) return 1; c2m (s, mbuf, charset); /* truncate "(Y/N)" */ for (len = 0; (mbuf[len]) && (len < 512); len++); for (; (mbuf[len] != '(') && (len > 0); len--); { Lisp_Object yes, str; struct gcpro gcpro1; str = make_string (mbuf, len); GCPRO1 (str); yes = call1 (Qyes_or_no_p, str); UNGCPRO; if (NILP (yes)) return 0; else return (1); } } static void puts2 (char *UNUSED (s)) { #if 0 /* jhod: We don't really need this echoed... */ Ibyte mbuf[512]; Lisp_Object charset; int snum; if ((snum = check_wnn_server_type ()) == -1) return; charset = charset_wnn_server_type[snum]; c2m (s, mbuf, charset); message ("%s", mbuf); #endif } int check_wnn_server_type (void) { if (EQ(Vwnn_server_type, Qjserver)) { return WNNSERVER_J; } else if (EQ(Vwnn_server_type, Qcserver)) { return WNNSERVER_C; } /* else if (Vwnn_server_type == Qtserver) { return WNNSERVER_T; } */ else if (EQ(Vwnn_server_type, Qkserver)) { return WNNSERVER_K; } else return -1; }