X-Git-Url: http://git.chise.org/gitweb/?p=elisp%2Fegg.git;a=blobdiff_plain;f=egg%2Fsj3.el;h=b011f05a33d2dcaa85fbc9665b6a2738e40cd840;hp=6f059a701b779dd8d31efb9dc90fb2b7b961bfa9;hb=76f334e2fe809b36369c21ae700fb4111c959cde;hpb=73cfac9422c79ee1a8577f2ed21ff83ac98ced3e diff --git a/egg/sj3.el b/egg/sj3.el index 6f059a7..b011f05 100644 --- a/egg/sj3.el +++ b/egg/sj3.el @@ -1,14 +1,14 @@ ;;; egg/sj3.el --- SJ3 Support (high level interface) in Egg ;;; Input Method Architecture -;; Copyright (C) 1997 Mule Project, Powered by Electrotechnical -;; Laboratory, JAPAN. +;; Copyright (C) 1997, 1998 Mule Project, +;; Powered by Electrotechnical Laboratory, JAPAN. ;; Project Leader: Satoru Tomura ;; Author: NIIBE Yutaka ;; Maintainer: NIIBE Yutaka -;; This file will be part of GNU Emacs (in future). +;; This file is part of EGG. ;; EGG is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -31,6 +31,11 @@ (defconst sj3-support-languages '("Japanese")) +(eval-when-compile + (defmacro SJ3-const (c) + (cond ((eq c 'FileNotExist) 35) + ))) + (defconst sj3-conversion-backend [ sj3-init @@ -44,15 +49,18 @@ sj3-decide-candidate sj3-change-bunsetsu-length sj3-end-conversion + nil sj3-fini ]) -(defconst sj3-server-port 3000 "Port number of SJ3 server") +(defvar sj3-server-port 3000 "Port number of SJ3 server") (defvar sj3-stdy-size 0 "STDYSIZE of SJ3 server") (defvar sj3-hostname "localhost" "Hostname of SJ3 server") +(defvar sj3-open-message) + (defun sj3-open (hostname) "Establish the connection to SJ3 server. Return process object." (let* ((buf (generate-new-buffer " *SJ3*")) @@ -84,6 +92,59 @@ (setq sj3-stdy-size result) proc)) +;; (defun sj3-open (hostname-list) +;; "Establish the connection to SJ3 server. Return process object." +;; (let* ((buf (generate-new-buffer " *SJ3*")) +;; (msg-form "SJ3: connecting to sj3serv at %s...") +;; hostname proc result msg) +;; (save-excursion +;; (set-buffer buf) +;; (erase-buffer) +;; (buffer-disable-undo) +;; (setq enable-multibyte-characters nil)) +;; (cond +;; ((null hostname-list) +;; (setq hostname-list '("localhost"))) +;; ((null (listp hostname-list)) +;; (setq hostname-list (list hostname-list)))) +;; (while (and hostname-list (null proc)) +;; (setq hostname (car hostname-list) +;; hostname-list (cdr hostname-list)) +;; (message msg-form hostname) +;; (sit-for 0) +;; (condition-case result +;; (setq proc (open-network-stream "SJ3" buf hostname sj3-server-port)) +;; (error nil)) +;; (if proc +;; (progn +;; (process-kill-without-query proc) +;; (set-process-coding-system proc 'no-conversion 'no-conversion) +;; (set-marker-insertion-type (process-mark proc) t) +;; ;; Initialize dictionaries +;; (setq sj3-sys-dict-list nil) +;; (setq sj3-user-dict-list nil) +;; (setq result (sj3rpc-open proc (system-name) (user-login-name))) +;; (if (< result 0) +;; (progn +;; (delete-process proc) +;; (setq proc nil +;; msg (format "Can't open SJ3 session (%s): %s" +;; hostname msg))) +;; (setq result (sj3rpc-get-stdy-size proc)) +;; (if (< result 0) +;; (progn +;; (delete-process proc) +;; (setq proc nil +;; msg (format "Can't get SJ3 STDYSIZE: %s" +;; (sj3rpc-get-error-message (- result))))) +;; (setq sj3-stdy-size result)))))) +;; (if proc +;; (progn +;; (setq sj3-open-message (format (concat msg-form "done") hostname)) +;; proc) +;; (kill-buffer buf) +;; (error "%s" (or msg "no sj3serv available"))))) + ;; ::= [ ] (defvar sj3-environment nil "Environment for SJ3 kana-kanji conversion") @@ -95,7 +156,7 @@ ;; ::= ;; [ -;; ] +;; ] (defsubst sj3-make-bunsetsu (env source converted rest stdy) (vector env source converted rest stdy nil nil nil)) @@ -117,9 +178,9 @@ (aref b 6)) (defsubst sj3bunsetsu-set-zenkouho-pos (b p) (aset b 6 p)) -(defsubst sj3bunsetsu-get-stdydown (b) +(defsubst sj3bunsetsu-get-kugiri-changed (b) (aref b 7)) -(defsubst sj3bunsetsu-set-stdydown (b s) +(defsubst sj3bunsetsu-set-kugiri-changed (b s) (aset b 7 s)) (defun sj3-get-bunsetsu-source (b) @@ -145,38 +206,92 @@ (t p))) (defun sj3-get-environment () + "Return the backend of SJ3 environment." (if sj3-environment sj3-environment (let* ((proc (sj3-open sj3-hostname)) - (stdy (sj3-filename (car sj3-dictionary-specification))) + (freq-info-name (sj3-filename (car sj3-dictionary-specification))) (l (cdr sj3-dictionary-specification)) dict-list) - (if (/= (sj3rpc-open-stdy proc stdy) 0) - (error "Dame1") ; XXX - (while l - (let ((dic (car l)) - dic-id) - (setq dic-id - (sj3rpc-open-dictionary proc (sj3-filename (aref dic 0)) - (aref dic 1))) - (if (< dic-id 0) - (error "Dame2") ; XXX - (setq dict-list (cons dic-id dict-list) - l (cdr l)))))) - (setq sj3-environment (vector proc dict-list))))) + (sj3-open-freq-info proc freq-info-name) + (while l + (let ((dic (car l)) + dic-id) + (setq dic-id + (sj3-open-dictionary proc (sj3-filename (aref dic 0)) + (aref dic 1))) + (if (< dic-id 0) + (error "Dame2") ; XXX + (setq dict-list (cons dic-id dict-list) + l (cdr l))))) + (setq sj3-environment (vector proc dict-list))))) + +(defun sj3-open-freq-info (proc name) + (let ((trying t) + ret) + (while trying + (setq ret (sj3rpc-open-stdy proc name)) + (if (= ret 0) + (setq trying nil) + (message "’³Ø’½¬’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó" name) + (if (/= ret (SJ3-const FileNotExist)) + (error "Fatal1") ; XXX + (if (and (y-or-n-p + (format "’³Ø’½¬’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó’¡£’ºî’¤ê’¤Þ’¤¹’¤«? " + name)) + (sj3rpc-make-directory proc + (file-name-directory name)) + ;; ignore error + (= (sj3rpc-make-stdy proc name) 0)) + (message "’³Ø’½¬’¥Õ’¥¡’¥¤’¥ë(%s)’¤ò’ºî’¤ê’¤Þ’¤·’¤¿" name) + (error "Fatal2"))))))) ; XXX + +(defun sj3-open-dictionary (proc name passwd) + (let ((trying t) + ret) + (while trying + (setq ret (sj3rpc-open-dictionary proc name passwd)) + (if (>= ret 0) + (setq trying nil) + (message "’¼­’½ñ’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó" name) + (setq ret (- ret)) ; Get error code. + (if (/= ret (SJ3-const FileNotExist)) + (error "Fatal3 %d" ret) ; XXX + (if (and (y-or-n-p + (format "’¼­’½ñ’¥Õ’¥¡’¥¤’¥ë(%s)’¤¬’¤¢’¤ê’¤Þ’¤»’¤ó’¡£’ºî’¤ê’¤Þ’¤¹’¤«? " + name)) + (= (sj3rpc-make-dictionary proc name) 0)) + (message "’¼­’½ñ’¥Õ’¥¡’¥¤’¥ë(%s)’¤ò’ºî’¤ê’¤Þ’¤·’¤¿" name) + (error "Fatal4"))))) ; XXX + ret)) (defun sj3-init () ) -(defun sj3-start-conversion (yomi lang) +(defun sj3-start-conversion (yomi &optional lang) "Convert YOMI string to kanji, and enter conversion mode. Return the list of bunsetsu." (let ((env (sj3-get-environment))) (sj3rpc-begin env yomi))) -;; XXX: not implemented yet -(defun sj3-end-conversion (bunsetsu-list) - ) +(defun sj3-end-conversion (bunsetsu-list abort) + (if abort + () + (let ((env (sj3bunsetsu-get-env (car bunsetsu-list))) + (l bunsetsu-list) + bunsetsu stdy kugiri-changed) + (while l + (setq bunsetsu (car l)) + (setq l (cdr l)) + (setq stdy (sj3bunsetsu-get-stdy bunsetsu)) + (if stdy + (sj3rpc-bunsetsu-stdy env stdy)) + (if (setq kugiri-changed (sj3bunsetsu-get-kugiri-changed bunsetsu)) + (let ((yomi1 (sj3bunsetsu-get-source bunsetsu)) + (yomi2 (sj3bunsetsu-get-source (car l)))) + (if (/= kugiri-changed (length yomi1)) + (sj3rpc-kugiri-stdy env yomi1 yomi2 + (sj3bunsetsu-get-stdy (car l)))))))))) (defun sj3-list-candidates (bunsetsu prev-bunsetsu) (let* ((env (sj3bunsetsu-get-env bunsetsu)) @@ -226,12 +341,10 @@ Return the list of bunsetsu." yomi2 (substring yomi len)) (setq bunsetsu1 (sj3rpc-tanbunsetsu-conversion env yomi1)) - ;; Only set once. - (sj3bunsetsu-set-stdydown bunsetsu1 - (or (sj3bunsetsu-get-stdydown b1) - (if b2 - (list b1 b2) - (list b1)))) + ;; Only set once (memory original length of the bunsetsu). + (sj3bunsetsu-set-kugiri-changed bunsetsu1 + (or (sj3bunsetsu-get-kugiri-changed b1) + (length (sj3bunsetsu-get-source b1)))) (if (< 0 (length yomi2)) (setq bunsetsu2 (sj3rpc-tanbunsetsu-conversion env yomi2)) (setq bunsetsu2 nil)) @@ -239,9 +352,17 @@ Return the list of bunsetsu." (list bunsetsu1 bunsetsu2) (list bunsetsu1)))) -;; XXX: Not implemented yet (defun sj3-fini (lang) - ) + (let ((proc (sj3env-get-proc sj3-environment)) + (dict-list (sj3env-get-dictionary-list sj3-environment)) + dict) + (while dict-list + (setq dict (car dict-list)) + (setq dict-list (cdr dict-list)) + (sj3rpc-close-dictionary proc dict)) ; XXX: check error + (sj3rpc-close-stdy proc) + (sj3rpc-close proc)) + (setq sj3-environment nil)) ;;; setup @@ -253,8 +374,7 @@ Return the list of bunsetsu." "Activate SJ3 backend of Tamagotchy." (egg-set-support-languages sj3-support-languages) (egg-set-conversion-backend sj3-conversion-backend - sj3-support-languages - nil) + sj3-support-languages) (apply 'egg-mode arg)) ;;; egg/sj3.el ends here.