Mercurial > hg > xemacs-beta
diff lisp/egg/egg-sj3-client.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | |
children | 262b8bb4a523 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/egg/egg-sj3-client.el Mon Aug 13 09:02:59 2007 +0200 @@ -0,0 +1,1307 @@ +;; Sj3 server interface for Egg +;; Coded by K.Ishii, Sony Corp. (kiyoji@sm.sony.co.jp) + +;; This file is part of Egg on Mule (Multilingual Environment) + +;; Egg is distributed in the forms of patches to GNU +;; Emacs under the terms of the GNU EMACS GENERAL PUBLIC +;; LICENSE which is distributed along with GNU Emacs by the +;; Free Software Foundation. + +;; Egg 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 EMACS GENERAL PUBLIC LICENSE for +;; more details. + +;; You should have received a copy of the GNU EMACS GENERAL +;; PUBLIC LICENSE along with Nemacs; see the file COPYING. +;; If not, write to the Free Software Foundation, 675 Mass +;; Ave, Cambridge, MA 02139, USA. + +;;; +;;; Mule - Sj3 server interface in elisp +;;; + +(provide 'sj3-client) + +;;;; $B=$@5%a%b!(!((B + +;;; Aug-4-94 by K.Ishii +;;; Bug fixed in sj3-put-kata. + +;;; Apr-6-94 by N.Tanaka +;;; Add version 2(japanese EUC) protocol + +;;; Jun-16-93 by H.Shirasaki <sirasaki@rd.ecip.osaka-u.ac.jp> +;;; In sj3-bunsetu-yomi-equal, typo fixed. + +;;; Apr-6-93 by T.Saneto <sanewo@pdp.crl.sony.co.jp> +;;; Bug fixed in sj3-bunsetu-yomi-equal. + +;;; Mar-19-93 by K.Ishii +;;; Changed sj3-server-dict-info for edit-dict + +;;; Aug-6-92 by K.Ishii +;;; $BF|K\8lH=Dj$K(B lc-jp $B$r;H$&$h$&$KJQ99(B + +;;; Jul-30-92 by K.Ishii +;;; $BD9$$J8>O$rJQ49$9$k$H$-$K5/$3$k(B "Args out of range" $B%(%i!<$N=$@5(B +;;; $BEPO?$7$?F0;l$N:o=|$,$G$-$k$h$&$K(B sj3-server-dict-info $B$N=$@5(B +;;; sj3serv $B$KEO$9%W%m%0%i%`L>$NJQ99(B + +;;; Jun-2-92 by K.Ishii +;;; Mule $BMQ$KJQ99(B + +;;; Dec-12-91 by K.Ishii +;;; $BJ8@a3X=,$,$&$^$/$G$-$J$$$3$H$,$"$k$?$a!"(Bsj3-result-buffer $B$rJQ99(B +;;; +;;; sj3-get-stdy $B$G(B "Count exceed." $B%(%i!<$rNI$/5/$3$9$N$G:o=|(B + +;;; Nov-26-91 by K.Ishii +;;; sj3-server-open $B$G(B host_name $B$H(B user_name $B$rEO$9=gHV$N=$@5(B +;;; +;;; sj3-server-henkan-next $B$r<B9T$7$F$h$/5/$3$k(B "Count exceed." $B$H$$$&(B +;;; $B%P%0$N=$@5(B +;;; +;;; sj3-server-henkan-next $B$G0l3gJQ49$HJ8@aJQ49$GBh0l8uJd$,0c$C$?>l9g(B +;;; $B$K5/$3$k%P%0$N=$@5(B($B$3$l$KH<$$J8@a3X=,(B sj3-server-b-study $B$N=$@5(B) + +;;; +;;; Sj3 deamon command constants +;;; + +(defconst SJ3_OPEN 1 "$BMxMQ<TEPO?(B") +(defconst SJ3_CLOSE 2 "$BMxMQ<T:o=|(B") +;;; +(defconst SJ3_DICADD 11 "$B<-=qDI2C(B") +(defconst SJ3_DICDEL 12 "$B<-=q:o=|(B") +;;; +(defconst SJ3_OPENSTDY 21 "$B3X=,%U%!%$%k%*!<%W%s(B") +(defconst SJ3_CLOSESTDY 22 "$B3X=,%U%!%$%k%/%m!<%:(B") +(defconst SJ3_STDYSIZE 23 "") +;;; +(defconst SJ3_LOCK 31 "$B<-=q%m%C%/(B") +(defconst SJ3_UNLOCK 32 "$B<-=q%"%s%m%C%/(B") +;;; +(defconst SJ3_BEGIN 41 "$BJQ493+;O(B") +(defconst SJ3_BEGIN_EUC 111 "$BJQ493+;O(B") +;;; +(defconst SJ3_TANCONV 51 "$B:FJQ49!JJ8@a?-=L!K(B") +(defconst SJ3_TANCONV_EUC 112 "$B:FJQ49!JJ8@a?-=L!K(B") +(defconst SJ3_KOUHO 54 "$B8uJd(B") +(defconst SJ3_KOUHO_EUC 115 "$B8uJd(B") +(defconst SJ3_KOUHOSU 55 "$B8uJd?t(B") +(defconst SJ3_KOUHOSU_EUC 116 "$B8uJd?t(B") +;;; +(defconst SJ3_STDY 61 "$BJ8@a3X=,(B") +(defconst SJ3_END 62 "$BJ8@aD93X=,(B") +(defconst SJ3_END_EUC 117 "$BJ8@aD93X=,(B") +;;; +(defconst SJ3_WREG 71 "$BC18lEPO?(B") +(defconst SJ3_WREG_EUC 118 "$BC18lEPO?(B") +(defconst SJ3_WDEL 72 "$BC18l:o=|(B") +(defconst SJ3_WDEL_EUC 119 "$BC18l:o=|(B") +;;; +(defconst SJ3_MKDIC 81 "") +(defconst SJ3_MKSTDY 82 "") +(defconst SJ3_MKDIR 83 "") +(defconst SJ3_ACCESS 84 "") +;;; +(defconst SJ3_WSCH 91 "$BC18l8!:w(B") +(defconst SJ3_WSCH_EUC 120 "$BC18l8!:w(B") +(defconst SJ3_WNSCH 92 "") +(defconst SJ3_WNSCH_EUC 121 "") +;;; +(defconst SJ3_VERSION 103 "") + +;;; Sj3 server version error +(defconst SJ3_DifferentVersion 11 "") +(defvar *sj3-current-server-version* nil) + +(defvar sj3-server-buffer nil "Buffer associated with Sj3 server process.") + +(defvar sj3-server-process nil "Sj3 Kana Kanji hankan process.") + +(defvar sj3-command-tail-position nil) +(defvar sj3-command-buffer nil) + +(defvar sj3-result-buffer nil) +(defvar sj3-henkan-string nil) +(defvar sj3-bunsetu-suu nil) + +(defvar sj3-return-code nil) +(defvar sj3-error-code nil) + +(defvar sj3-stdy-size nil) +(defvar sj3-user-dict-list nil) +(defvar sj3-sys-dict-list nil) +(defvar sj3-yomi-llist nil) +;;; +;;; Put data into buffer +;;; + +(defun sj3-put-4byte (integer) + (insert (logand 255 (ash integer -24)) + (logand 255 (ash integer -16)) + (logand 255 (ash integer -8)) + (logand 255 (ash integer 0)) )) + +(defun sj3-put-string (str) + (insert str 0)) + +(defun sj3-put-string* (str) + (let ((sstr (if (= *sj3-current-server-version* 2) + (code-convert-string str *internal* *euc-japan*) + (code-convert-string str *internal* *sjis*)))) + (insert sstr 0))) + +;;; +;;; Get data from buffer +;;; + +(defun sj3-get-4byte () + + (let ((c 0) (point (point))) + ;;;(goto-char (point-min)) + (while (< (point-max) (+ point 4)) + (accept-process-output) + (if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed."))) + (setq c (1+ c))) + (goto-char point)) + + (let ((point (point))) + (if (not (or (and (= (char-after point) 0) + (< (char-after (+ point 1)) 128)) + (and (= (char-after point) 255) + (<= 128 (char-after (+ point 1)))))) + (error "sj3-get-4byte: integer range overflow.")) + (prog1 + (logior + (lsh (char-after point) 24) + (lsh (char-after (+ point 1)) 16) + (lsh (char-after (+ point 2)) 8) + (lsh (char-after (+ point 3)) 0)) + (goto-char (+ (point) 4))))) + +(defun sj3-get-byte () + (let ((c 0) (point (point))) + (while (< (point-max) (1+ point)) + (accept-process-output) + (if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed."))) + (setq c (1+ c))) + (goto-char point) + (prog1 + (lsh (char-after point) 0) + (forward-char 1)))) + +(defun sj3-get-string () + (let ((point (point))) + (skip-chars-forward "^\0") + (let ((c 0)) + (while (eobp) + (accept-process-output) + (if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed"))) + (setq c (1+ c)) + (skip-chars-forward "^\0"))) + (prog1 + (buffer-substring point (point)) + (forward-char 1)))) + +(defun sj3-get-string* () + (let ((point (point))) + (sj3-get-convert-string) + (buffer-substring point (1- (point))))) + +(defun sj3-get-convert-string () + (let ((point (point)) (c 0) str) + (while (not (search-forward "\0" nil t)) + (accept-process-output) + (goto-char point) + (if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed"))) + (setq c (1+ c))) + (setq str (buffer-substring point (1- (point)))) + (delete-region point (point)) + (insert (if (= *sj3-current-server-version* 2) + (code-convert-string str *euc-japan* *internal*) + (code-convert-string str *sjis* *internal*)) 0))) + +(defun sj3-get-stdy () + (let ((c 0) (point (point))) + (while (< (point-max) (+ point sj3-stdy-size)) + (accept-process-output) + (if (>= c 10) (progn (sit-for 0) (setq c 0))) ;;; delete error + (setq c (1+ c))) + (goto-char (+ point sj3-stdy-size)))) + +;;; +;;; Sj3 Server Command Primitives +;;; + +(defun sj3-command-start (command) + (set-buffer sj3-command-buffer) + (goto-char (point-min)) + (if (not (= (point-max) (+ sj3-command-tail-position 1024))) + (error "sj3 command start error")) + (delete-region (point-min) sj3-command-tail-position) + (sj3-put-4byte command)) + +(defun sj3-command-reset () + (save-excursion + (progn + ;;; for Mule + (if (fboundp 'set-process-coding-system) + (set-process-coding-system sj3-server-process *noconv* *noconv*)) + ;;; for Nemacs 3.0 and later +;; (if (fboundp 'set-process-kanji-code) +;; (set-process-kanji-code sj3-server-process 0)) + (set-buffer sj3-command-buffer) + (setq mc-flag nil) ;;; for Mule +;; (setq kanji-flag nil) +;; (setq kanji-fileio-code 0) ;;; for Nemacs 2.1 + (buffer-disable-undo sj3-command-buffer) + (erase-buffer) + (setq sj3-command-tail-position (point-min)) + (let ((max 1024) (i 0)) + (while (< i max) + (insert 0) + (setq i (1+ i))))))) + +(defun sj3-command-end () + (set-buffer sj3-server-buffer) + (erase-buffer) + (set-buffer sj3-command-buffer) + (setq sj3-command-tail-position (point)) +;; (process-send-region sj3-server-process (point-min) +;; (+ (point-min) (lsh (1+ (lsh (- (point) (point-min)) -10)) 10))) + (process-send-region sj3-server-process (point-min) (1+ (point))) + ) + +;;; +;;; Sj3 Server Reply primitives +;;; + +(defun sj3-get-result () + (set-buffer sj3-server-buffer) + (condition-case () + (accept-process-output sj3-server-process) + (error nil)) + (goto-char (point-min))) + +(defun sj3-get-return-code () + (setq sj3-return-code (sj3-get-4byte)) + (setq sj3-error-code (if (= sj3-return-code 0) nil + (sj3-error-symbol sj3-return-code))) + (if sj3-error-code nil + sj3-return-code)) + +;;; +;;; Sj3 Server Interface: sj3-server-open +;;; + +;(defvar *sj3-server-max-kana-string-length* 1000) +;(defvar *sj3-server-max-bunsetu-suu* 1000) + +(defvar *sj3-server-version* 2) +(setq *sj3-server-version* 2) +(defvar *sj3-program-name* "sj3-egg-m") +(defvar *sj3-service-name* "sj3") + +(defun sj3-server-open (server-host-name login-name) + (if (sj3-server-active-p) t + (let ((server_version *sj3-server-version*) + (sj3serv_name + (if (or (null server-host-name) + (equal server-host-name "") + (equal server-host-name "unix")) + (system-name) + server-host-name)) + (user_name + (if (or (null login-name) (equal login-name "")) + (user-login-name) + login-name)) + (host_name (system-name)) + (program_name + (format "%d.%s" + (string-to-int (substring (make-temp-name "") 1 6)) + *sj3-program-name*))) + (setq sj3-server-process + (condition-case var + (open-network-stream "Sj3" " [Sj3 Output Buffer] " + sj3serv_name *sj3-service-name* ) + (error + (cond((string-match "Unknown host" (car (cdr var))) + (setq sj3-error-code (list ':SJ3_UNKNOWN_HOST + sj3serv_name))) + ((string-match "Unknown service" (car (cdr var))) + (setq sj3-error-code (list ':SJ3_UNKNOWN_SERVICE + *sj3-service-name*))) + (t ;;; "Host ... not respoding" + (setq sj3-error-code ':SJ3_SOCK_OPEN_FAIL))) + nil))) + (if (null sj3-server-process) nil + (process-kill-without-query sj3-server-process) + (setq sj3-server-buffer (get-buffer " [Sj3 Output Buffer] ")) + (setq sj3-command-buffer (get-buffer-create " [Sj3 Command Buffer] ")) + (setq sj3-result-buffer (get-buffer-create " [Sj3 Result Buffer] ")) + + (save-excursion + ;;; for Mule + (if (fboundp 'set-process-coding-system) + (set-process-coding-system + sj3-server-process *noconv* *noconv*)) + ;;; for Nemacs 3.0 +;; (if (fboundp 'set-process-kanji-code) +;; (set-process-kanji-code sj3-server-process 0)) + (progn + (set-buffer sj3-server-buffer) + (setq mc-flag nil) ;;; for Mule +;; (setq kanji-flag nil) + ;;; for Nemacs 2.1 +;; (setq kanji-fileio-code 0) + (buffer-disable-undo sj3-server-buffer) + ) + (progn + (set-buffer sj3-result-buffer) + (setq mc-flag nil) ;;; for Mule +;; (setq kanji-flag nil) + ;;; for Nemacs 2.1 +;; (setq kanji-fileio-code 0) + (buffer-disable-undo sj3-result-buffer)) + (progn + (set-buffer sj3-command-buffer) + (setq mc-flag nil) ;;; for Mule +;; (setq kanji-flag nil) + ;;; for Nemacs 2.1 +;; (setq kanji-fileio-code 0) + (buffer-disable-undo sj3-command-buffer) + (erase-buffer) + (setq sj3-command-tail-position (point-min)) + (let ((max 1024) (i 0)) + (while (< i max) + (insert 0) + (setq i (1+ i))))) + (sj3-clear-dict-list) + (sj3-command-start SJ3_OPEN) + (sj3-put-4byte server_version) + (sj3-put-string host_name) + (sj3-put-string user_name) + (sj3-put-string program_name) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code) + (if (= sj3-return-code SJ3_DifferentVersion) + (progn (sj3-command-start SJ3_OPEN) + (sj3-put-4byte 1) + (sj3-put-string host_name) + (sj3-put-string user_name) + (sj3-put-string program_name) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code) + (if (not (= sj3-return-code 0)) + (sj3-connection-error) + nil) + ) + nil) + (if (or (= sj3-return-code 0) (> -1 sj3-return-code)) + (progn (setq *sj3-current-server-version* 1) + (if (not (= sj3-return-code 0)) + (setq *sj3-current-server-version* (- 0 sj3-return-code)) + nil) + (sj3-get-stdy-size) + ) + nil) + ))))) + +(defun sj3-server-active-p () + (and sj3-server-process + (eq (process-status sj3-server-process) 'open))) + +(defun sj3-connection-error () + (setq sj3-error-code ':sj3-no-connection) + (setq sj3-return-code -1) + nil) + +(defun sj3-zero-arg-command (op) + (if (sj3-server-active-p) + (progn + (sj3-command-start op) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code)) + (sj3-connection-error))) + +(defun sj3-server-close () + (let (dict-no) + (while (and (sj3-server-active-p) (setq dict-no (car sj3-sys-dict-list))) + (sj3-server-close-dict dict-no) + (setq sj3-sys-dict-list (cdr sj3-sys-dict-list))) + (while (and (sj3-server-active-p) (setq dict-no (car sj3-user-dict-list))) + (sj3-server-close-dict dict-no) + (setq sj3-user-dict-list (cdr sj3-user-dict-list))) + (sj3-clear-dict-list)) + (sj3-server-close-stdy) + (sj3-zero-arg-command SJ3_CLOSE) + (if (sj3-server-active-p) + (delete-process sj3-server-process)) + (if sj3-server-buffer + (kill-buffer sj3-server-buffer)) + (if sj3-command-buffer + (kill-buffer sj3-command-buffer)) + (if sj3-result-buffer + (kill-buffer sj3-result-buffer)) + (setq sj3-server-process nil) + (setq sj3-server-buffer nil) + (setq sj3-command-buffer nil) + (setq sj3-result-buffer nil)) + +(defun sj3-clear-dict-list () + (setq sj3-sys-dict-list nil) + (setq sj3-user-dict-list nil)) + +(or (fboundp 'si:kill-emacs) + (fset 'si:kill-emacs (symbol-function 'kill-emacs))) + +(defun kill-emacs (&optional arg) + (interactive "P") + (if (sj3-server-active-p) + (progn + (sj3-server-close))) + (si:kill-emacs arg)) + +(defun sj3-get-stdy-size () + (sj3-zero-arg-command SJ3_STDYSIZE) + (if (not (= sj3-return-code 0)) nil + (setq sj3-stdy-size (sj3-get-4byte)))) + +(defun sj3-put-stdy-dmy () + (let ((i 0)) + (while (< i sj3-stdy-size) + (insert 0) + (setq i (1+ i))))) + +;;; Sj3 Result Buffer's layout: +;;; +;;; { length:4 kana 0 kouhoSuu:4 kouhoNo:4 +;;; {studyData kanji 0 } ... +;;; } +;;; 0 0 0 0 + +(defun sj3-skip-length () + (goto-char (+ (point) 4))) + +(defun sj3-skip-4byte () + (goto-char (+ (point) 4))) + +(defun sj3-skip-yomi () + (skip-chars-forward "^\0") (forward-char 1)) + +(defun sj3-skip-stdy () + (goto-char (+ (point) sj3-stdy-size))) + +;;; +;;; entry function +;;; +(defun sj3-server-henkan-begin (henkan-string) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t) mb-str) + (save-excursion + (setq sj3-henkan-string henkan-string) + (if (= *sj3-current-server-version* 2) + (setq mb-str (code-convert-string henkan-string *internal* *euc-japan*)) + (setq mb-str (code-convert-string henkan-string *internal* *sjis*)) + ) + (set-buffer sj3-result-buffer) + (erase-buffer) + (setq sj3-bunsetu-suu 0) + (setq sj3-yomi-llist nil) + (goto-char (point-min)) + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_BEGIN_EUC) + (sj3-command-start SJ3_BEGIN) + ) + (sj3-put-string mb-str) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code) + (if (not (= sj3-return-code 0)) nil + (let ((yp 0) p0 yl offset) + (sj3-get-4byte) + (set-buffer sj3-result-buffer) + (delete-region (point) (point-max)) + (setq p0 (point)) + (insert sj3-henkan-string 0 0 0 0) + (goto-char p0) + (set-buffer sj3-server-buffer) + (while (> (setq yl (sj3-get-byte)) 0) + (let ((startp (point)) + (ystr (substring mb-str yp (+ yp yl))) + endp) + (setq yp (+ yp yl)) + (if (= *sj3-current-server-version* 2) + (setq yl (length (code-convert-string ystr *euc-japan* *internal*))) + (setq yl (length (code-convert-string ystr *sjis* *internal*))) + ) + (sj3-get-stdy) ;;; skip study-data + (sj3-get-convert-string) + (setq endp (point)) + (set-buffer sj3-result-buffer) + (setq p0 (point)) + (forward-char yl) + (setq sj3-yomi-llist (append sj3-yomi-llist (list yl))) + (insert 0) ;;; yomi + (sj3-put-4byte 1) ;;; kouho suu + (sj3-put-4byte 0) ;;; current kouho number + (insert-buffer-substring sj3-server-buffer startp endp) + ;;; insert study data and kanji strings + (setq offset (- (point) p0)) + (goto-char p0) (sj3-put-4byte offset) + (goto-char (+ (point) offset)) + (setq sj3-return-code (1+ sj3-return-code)) + (set-buffer sj3-server-buffer))) + (setq sj3-bunsetu-suu sj3-return-code))))))) +;;; +;;; entry function +;;; +(defun sj3-server-henkan-quit () t) + +(defun sj3-get-yomi-suu-org () + (if (setq sj3-yomi-llist (cdr sj3-yomi-llist)) + (car sj3-yomi-llist) + 0)) + +;;; +;;; entry function +;;; +(defun sj3-server-henkan-end (bunsetu-no) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (let (length ystr len kouho-no kouho-suu p0 (ylist nil)) + (set-buffer sj3-result-buffer) + (goto-char (point-min)) + (let ((max (if (and (integerp bunsetu-no) + (<= 0 bunsetu-no) + (<= bunsetu-no sj3-bunsetu-suu)) + bunsetu-no + sj3-bunsetu-suu)) + (i 0)) + (while (< i max) + (setq length (sj3-get-4byte)) + (setq p0 (point)) + (setq ystr (sj3-get-string)) + (setq len (1- (- (point) p0))) + (setq kouho-suu (sj3-get-4byte)) ;;; kouho suu + (setq kouho-no (sj3-get-4byte)) + (if (and (> kouho-no 0) + (< kouho-no (- kouho-suu 2)) + (> kouho-suu 3)) + (sj3-server-b-study kouho-no)) + (setq ylist (cons (list len ystr kouho-suu (point)) ylist)) + (goto-char (+ p0 length)) + (setq i (1+ i))) + (setq ylist (nreverse ylist)) + (setq i 1) + (let ((yp 0) (op 0) (ydata (car ylist)) (ol (car sj3-yomi-llist))) + (while (< i max) + (let ((yl (nth 0 ydata))) + (setq ylist (cdr ylist)) + (if (and (= yp op) (= yl ol)) + (let ((pp (+ yp yl))) + (setq yp pp) + (setq op pp) + (setq ydata (car ylist)) + (setq ol (sj3-get-yomi-suu-org))) + (let ((str (nth 1 ydata)) + (ent (nth 2 ydata))) + (setq ydata (car ylist)) + (setq yp (+ yp yl)) + (while (< op yp) + (setq op (+ op ol)) + (setq ol (sj3-get-yomi-suu-org))) + (if (or (= ent 2) (= (nth 2 ydata) 2)) nil + (let ((sub (- op yp)) (yl1 (nth 0 ydata))) + (set-buffer sj3-result-buffer) + (goto-char (nth 3 ydata)) + (sj3-server-cl-study str (nth 1 ydata)) + (if (and (not (= sub yl1)) (not (= sub (- yl1 ol)))) + nil + (setq i (1+ i)) + (setq ylist (cdr ylist)) + (setq ydata (car ylist)) + (if (= sub yl1) nil + (setq op (+ op ol)) + (setq ol (sj3-get-yomi-suu-org)))))))) + (setq i (1+ i)))) + (if (or (null ydata) (= (nth 0 ydata) ol) (= (nth 2 ydata) 2)) + sj3-return-code + (goto-char (nth 3 ydata)) + (sj3-server-cl-study (nth 1 ydata) ""))))))))) + +(defun sj3-server-cl-study (str1 str2) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (save-excursion + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_END_EUC) + (sj3-command-start SJ3_END)) + (sj3-put-string* str1) + (sj3-put-string* str2) + (if (string= str2 "") (sj3-put-stdy-dmy) + (let (p0) + (set-buffer sj3-result-buffer) + (setq p0 (point)) + (set-buffer sj3-command-buffer) + (insert-buffer-substring sj3-result-buffer p0 (+ p0 sj3-stdy-size)))) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code)))) + +(defun sj3-server-b-study (no) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (save-excursion + (let ((i 0) p0) + (set-buffer sj3-result-buffer) + (while (< i no) + (sj3-skip-stdy) + (sj3-skip-yomi) + (setq i (1+ i))) + (setq p0 (point)) + (sj3-command-start SJ3_STDY) + (insert-buffer-substring sj3-result-buffer p0 (+ p0 sj3-stdy-size)) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-result-goto-bunsetu (bunsetu-no) + (goto-char (point-min)) + (let (length (i 0)) + (while (< i bunsetu-no) + (setq length (sj3-get-4byte)) + (goto-char (+ (point) length)) + (setq i (1+ i))))) + +;;; +;;; entry function +;;; +(defun sj3-server-henkan-kakutei (bunsetu-no jikouho-no) + (cond((not (sj3-server-active-p)) (sj3-connection-error)) + ((or (< bunsetu-no 0) (<= sj3-bunsetu-suu bunsetu-no)) + nil) + (t + (let ((inhibit-quit t)) + (save-excursion + (set-buffer sj3-result-buffer) + (let (kouho-suu) + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (sj3-skip-yomi) + (setq kouho-suu (sj3-get-4byte)) + (if (or (< jikouho-no 0) (<= kouho-suu jikouho-no)) nil + (delete-char 4) (sj3-put-4byte jikouho-no) + t))))))) + +;;; +;;; entry function +;;; +(defun sj3-server-henkan-next (bunsetu-no) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (let (p0 p1 kouho-suu length ystr) + (set-buffer sj3-result-buffer) + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (setq p0 (point)) + (setq ystr (sj3-get-string)) + (setq p1 (point)) + (setq kouho-suu (sj3-get-4byte)) + (if (> kouho-suu 1) t + (let ((ksuu (sj3-server-henkan-kouho ystr)) (startp 0) endp) + (if (< ksuu 0) sj3-return-code + (let (kanji) + (set-buffer sj3-result-buffer) + (sj3-skip-4byte) + (sj3-skip-stdy) + (setq kanji (sj3-get-string)) + (if (> ksuu 1) + (let ((i 1)) + (set-buffer sj3-server-buffer) + (sj3-get-4byte) + (setq startp (point)) + (sj3-get-stdy) + (let ((kkanji (sj3-get-string*))) + (if (equal kanji kkanji) + (setq startp (point)) + (setq ksuu (1+ ksuu)) + (setq i (1+ i)))) + (while (< i ksuu) + (sj3-get-4byte) + (delete-char -4) + (sj3-get-stdy) + (sj3-get-convert-string) + (setq i (1+ i))) + (setq endp (point)))) + (set-buffer sj3-result-buffer) + (if (> startp 0) + (insert-buffer-substring sj3-server-buffer startp endp)) + (sj3-put-kata ystr) + (insert ystr 0) + (setq length (- (point) p0)) + (goto-char p1) + (delete-char 4) + (if (<= ksuu 0)(sj3-put-4byte 3) ;;; + (sj3-put-4byte (+ ksuu 2))) ;;; put kouho-suu + (goto-char p0) + (delete-char -4) + (sj3-put-4byte length)) + t)))))))) + +(defun sj3-server-henkan-kouho (str) + (if (not (sj3-server-active-p)) -1 + (let ((mb-str (if (= *sj3-current-server-version* 2) + (code-convert-string str *internal* *euc-japan*) + (code-convert-string str *internal* *sjis*))) + len kouho-suu) + (setq len (length mb-str)) + (setq kouho-suu (sj3-server-henkan-kouho-suu len mb-str)) + (if (<= kouho-suu 0) nil + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_KOUHO_EUC) + (sj3-command-start SJ3_KOUHO)) + (sj3-put-4byte len) + (sj3-put-string mb-str) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code) + (if (not (= sj3-return-code 0)) -1)) + kouho-suu))) + +(defun sj3-put-kata (str) + (setq str (copy-sequence str)) + (let ((i 0) (len (length str))) + (while (< i len) + (if (/= (aref str i) lc-jp) + (setq i (1+ i)) + (if (= (aref str (1+ i)) ?\244) + (aset str (1+ i) ?\245)) + (setq i (+ i 3))))) + (insert str 0)) + +(defun sj3-server-henkan-kouho-suu (yomi-length yomi) + (if (not (sj3-server-active-p)) -1 + (save-excursion + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_KOUHOSU_EUC) + (sj3-command-start SJ3_KOUHOSU)) + (sj3-put-4byte yomi-length) + (sj3-put-string yomi) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code) + (if (not (= sj3-return-code 0)) -1 + (sj3-get-4byte))))) + +;;; +;;; entry function +;;; +(defun sj3-server-bunsetu-henkou (bunsetu-no bunsetu-length) + (cond((not (sj3-server-active-p)) (sj3-connection-error)) + ((or (< bunsetu-no 0) (<= sj3-bunsetu-suu bunsetu-no)) + nil) + (t + (let ((inhibit-quit t)) + (save-excursion + (let (yp0 p0 p1 str len1 len2 bunsetu-suu (bno bunsetu-no)) + (set-buffer sj3-result-buffer) + (setq yp0 (sj3-yomi-point bunsetu-no)) + (setq p0 (point)) + (setq str (sj3-get-yomi* yp0 bunsetu-length)) + (setq len1 (length str)) + (setq bunsetu-suu sj3-bunsetu-suu) + (let (point length) + (setq len2 len1) + (while (and (< bno sj3-bunsetu-suu) (> len2 0)) + (setq length (sj3-get-4byte)) + (setq point (point)) + (skip-chars-forward "^\0") + (setq len2 (- len2 (- (point) point))) + (goto-char (+ point length)) + (setq bno (1+ bno)))) + (setq p1 (point)) + (delete-region p0 p1) + (setq sj3-bunsetu-suu (- sj3-bunsetu-suu (- bno bunsetu-no))) + (if (= (sj3-put-tanconv str) 0) + (if (not (= len2 0)) + (let ((len (- 0 len2)) (yp1 (+ yp0 len1)) + ystr mb-str) + (if (or (> bno (1+ bunsetu-no)) (= bno bunsetu-suu)) + (setq ystr (sj3-get-yomi yp1 len)) + (let (ll length i) + (set-buffer sj3-result-buffer) + (setq p0 (point)) + (setq length (sj3-get-4byte)) + (skip-chars-forward "^\0") + (setq ll (+ len (- (point) (+ p0 4)))) + (setq p1 (+ p0 (+ length 4))) + (setq ystr (sj3-get-yomi yp1 ll)) + (setq mb-str (if (= *sj3-current-server-version* 2) + (code-convert-string ystr *internal* *euc-japan*) + (code-convert-string ystr *internal* *sjis*))) + (setq i (sj3-server-henkan-kouho-suu + (length mb-str) mb-str)) + (set-buffer sj3-result-buffer) + (if (= i 0) (setq ystr (sj3-get-yomi yp1 len)) + (delete-region p0 p1) + (setq sj3-bunsetu-suu (1- sj3-bunsetu-suu)) + (setq len ll)) + (goto-char p0))) + (sj3-put-tanconv ystr)))) + (if (= sj3-return-code -1) nil + sj3-bunsetu-suu))))))) + +(defun sj3-put-tanconv (str) + (let ((point (point)) len ksuu + (mb-str (if (= *sj3-current-server-version* 2) + (code-convert-string str *internal* *euc-japan*) + (code-convert-string str *internal* *sjis*)))) + (setq len (length mb-str)) + (setq ksuu (sj3-server-henkan-kouho-suu len mb-str)) + (if (>= ksuu 0) + (let (offset) + (set-buffer sj3-result-buffer) + (insert str 0) + (if (or (= ksuu 0) + (not (sj3-server-tanconv len mb-str))) + (put-kata-and-hira str) + (let (p0 p1) + (set-buffer sj3-result-buffer) + (sj3-put-4byte 1) + (sj3-put-4byte 0) + (set-buffer sj3-server-buffer) + (sj3-get-4byte) + (setq p0 (point)) + (sj3-get-stdy) + (sj3-get-convert-string) + (setq p1 (point)) + (set-buffer sj3-result-buffer) + (insert-buffer-substring sj3-server-buffer p0 p1))) + (set-buffer sj3-result-buffer) + (setq offset (- (point) point)) + (goto-char point) (sj3-put-4byte offset) + (goto-char (+ (point) offset)) + (setq sj3-bunsetu-suu (1+ sj3-bunsetu-suu)))) + sj3-return-code)) + +(defun sj3-server-tanconv (len str) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_TANCONV_EUC) + (sj3-command-start SJ3_TANCONV)) + (sj3-put-4byte len) + (sj3-put-string str) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code)))) + +(defun put-kata-and-hira (str) + (sj3-put-4byte 2) + (sj3-put-4byte 0) + (sj3-put-stdy-dmy) + (sj3-put-kata str) + (insert str 0)) + +(defun sj3-get-yomi (offset length) + (substring sj3-henkan-string offset (+ offset length))) + +(defun sj3-get-yomi* (offset bunsetu-length) + (let ((i 0) (c offset)) + (while (< i bunsetu-length) + (let ((ch (substring sj3-henkan-string c (1+ c)))) + (if (string= ch "\222");;lc-jp + (setq c (+ 3 c)) + (setq c (1+ c))) + (setq i (1+ i)))) + (substring sj3-henkan-string offset c))) + +(defun sj3-bunsetu-suu () sj3-bunsetu-suu) + +(defun sj3-bunsetu-kanji (bunsetu-no &optional buffer) + (let ((savebuffer (current-buffer))) + (unwind-protect + (progn + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (sj3-skip-yomi) + + (let ((i 0) + (rksuu (- (sj3-get-4byte) 2)) ;;; real kouho-suu + (max (sj3-get-4byte))) ;;; kouho-number + (sj3-skip-stdy) + (while (< i max) + (sj3-skip-yomi) + (setq i (1+ i)) + (if (< i rksuu) + (sj3-skip-stdy)))) + + (let ( p1 p2 ) + (setq p1 (point)) + (skip-chars-forward "^\0") (setq p2 (point)) + (forward-char 1) + (if (null buffer) + (concat (buffer-substring p1 p2)) + (set-buffer buffer) + (insert-buffer-substring sj3-result-buffer p1 p2) + nil)))) + (set-buffer savebuffer)))) + +(defun sj3-bunsetu-kanji-length (bunsetu-no) + (save-excursion + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (sj3-skip-yomi) + + (let ((i 0) + (rksuu (- (sj3-get-4byte) 2)) ;;; real kouho-suu + (max (sj3-get-4byte))) ;;; kouho-number + (sj3-skip-stdy) + (while (< i max) + (sj3-skip-yomi) + (setq i (1+ i)) + (if (< i rksuu) + (sj3-skip-stdy)))) + + (let ( p1 p3 ) + (setq p1 (point)) + (skip-chars-forward "^\0") + (setq p3 (point)) + (- p3 p1))))) + +(defun sj3-bunsetu-yomi-moji-suu (bunsetu-no) + (save-excursion + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (let ((c 0) ch) + (while (not (zerop (setq ch (following-char)))) + (if (= ch lc-jp) + (forward-char 3) + (forward-char 1)) + (setq c (1+ c))) + c)))) + +(defun sj3-yomi-point (bunsetu-no) + (let ((i 0) (len 0) point length) + (goto-char (point-min)) + (while (< i bunsetu-no) + (setq length (sj3-get-4byte)) + (setq point (point)) + (skip-chars-forward "^\0") + (setq len (+ len (- (point) point))) + (goto-char (+ point length)) + (setq i (1+ i))) + len)) + +(defun sj3-bunsetu-yomi (bunsetu-no &optional buffer) + (let ((savebuff (current-buffer))) + (unwind-protect + (progn + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (let (p1 p2 ) + (setq p1 (point)) + (skip-chars-forward "^\0") + (if (null buffer ) (buffer-substring p1 (point)) + (setq p2 (point)) + (set-buffer buffer) + (insert-buffer-substring sj3-result-buffer p1 p2) + t)))) + (set-buffer savebuff)))) + +(defun sj3-bunsetu-yomi-equal (bunsetu-no yomi) + (save-excursion + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (looking-at (regexp-quote yomi))))) ;93.4.6 by T.Saneto + +(defun sj3-bunsetu-kouho-suu (bunsetu-no) + (save-excursion + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (sj3-skip-yomi) + (sj3-get-4byte)))) + +(defun sj3-bunsetu-kouho-list (bunsetu-no) + (save-excursion + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (sj3-skip-yomi) + (let ((max (sj3-get-4byte)) (i 0) (result nil) p0) + (sj3-skip-4byte) ;;; current kouhou number + (sj3-skip-stdy) + (while (< i max) + (setq p0 (point)) + (skip-chars-forward "^\0") + (setq result + (cons (concat (buffer-substring p0 (point))) + result)) + (forward-char 1) + (setq i (1+ i)) + (if (< i (- max 2)) + (sj3-skip-stdy))) + (nreverse result))))) + +(defun sj3-bunsetu-kouho-number (bunsetu-no) + (save-excursion + (set-buffer sj3-result-buffer) + (if (or (< bunsetu-no 0) + (<= sj3-bunsetu-suu bunsetu-no)) + nil + (sj3-result-goto-bunsetu bunsetu-no) + (sj3-skip-length) + (sj3-skip-yomi) + (sj3-skip-4byte) + (sj3-get-4byte))) + ) + +(defun sj3-simple-command (op arg) + (if (sj3-server-active-p) + (let ((inhibit-quit t)) + (progn + (sj3-command-start op) + (sj3-put-4byte arg) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))) + (sj3-connection-error))) + +(defun sj3-server-open-dict (dict-file-name password) + (if (not (sj3-server-active-p))(sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_DICADD) + (sj3-put-string dict-file-name) + (if (stringp password) + (sj3-put-string password) + (sj3-put-string 0)) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code) + (if (not (= sj3-return-code 0)) nil + (let ((dict-no (sj3-get-4byte))) + (if (stringp password) + (setq sj3-user-dict-list + (append sj3-user-dict-list (list dict-no))) + (setq sj3-sys-dict-list + (append sj3-sys-dict-list (list dict-no)))) + dict-no)))))) + +(defun sj3-server-close-dict (dict-no) + (if (not (sj3-server-active-p))(sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_DICDEL) + (sj3-put-4byte dict-no) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-make-dict (dict-file-name) + (if (not (sj3-server-active-p))(sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_MKDIC) + (sj3-put-string dict-file-name) + (sj3-put-4byte 2048) ;;; Index length + (sj3-put-4byte 2048) ;;; Length + (sj3-put-4byte 256) ;;; Number + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-open-stdy (stdy-file-name) + (if (not (sj3-server-active-p))(sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_OPENSTDY) + (sj3-put-string stdy-file-name) + (sj3-put-string 0) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-close-stdy () + (sj3-zero-arg-command SJ3_CLOSESTDY)) + +(defun sj3-server-make-stdy (stdy-file-name) + (if (not (sj3-server-active-p))(sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_MKSTDY) + (sj3-put-string stdy-file-name) + (sj3-put-4byte 2048) ;;; Number + (sj3-put-4byte 1) ;;; Step + (sj3-put-4byte 2048) ;;; Length + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-dict-add (dictno kanji yomi bunpo) + (if (not (sj3-server-active-p))(sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_WREG_EUC) + (sj3-command-start SJ3_WREG)) + (sj3-put-4byte dictno) + (sj3-put-string* yomi) + (sj3-put-string* kanji) + (sj3-put-4byte bunpo) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-dict-delete (dictno kanji yomi bunpo) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (if (= *sj3-current-server-version* 2) + (sj3-command-start SJ3_WDEL_EUC) + (sj3-command-start SJ3_WDEL)) + (sj3-put-4byte dictno) + (sj3-put-string* yomi) + (sj3-put-string* kanji) + (sj3-put-4byte bunpo) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-dict-info (dict-no) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (let ((result nil)) + (set-buffer sj3-server-buffer) + (if (= *sj3-current-server-version* 2) + (sj3-simple-command SJ3_WSCH_EUC dict-no) + (sj3-simple-command SJ3_WSCH dict-no)) + (while (= sj3-return-code 0) + ;;; (sj3-get-4byte) + (setq result (cons (list (sj3-get-string*) + (sj3-get-string*) (sj3-get-4byte)) result)) + (if (= *sj3-current-server-version* 2) + (sj3-simple-command SJ3_WNSCH_EUC dict-no) + (sj3-simple-command SJ3_WNSCH dict-no))) + (if (= sj3-return-code 111) + (setq sj3-error-code nil)) + (nreverse result)))))) + +(defun sj3-server-make-directory (dir-name) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_MKDIR) + (sj3-put-string dir-name) + (sj3-command-end) + (sj3-get-result) + (sj3-get-return-code))))) + +(defun sj3-server-file-access (file-name access-mode) + (if (not (sj3-server-active-p)) (sj3-connection-error) + (let ((inhibit-quit t)) + (save-excursion + (sj3-command-start SJ3_ACCESS) + (sj3-put-string file-name) + (sj3-put-4byte access-mode) + (sj3-command-end) + (sj3-get-result) + (setq sj3-error-code nil) + (sj3-get-4byte))))) + +(defun sj3_lock () + (sj3-zero-arg-command SJ3_LOCK)) + +(defun sj3_unlock () + (sj3-zero-arg-command SJ3_UNLOCK)) + +(defun sj3_version () + (sj3-zero-arg-command SJ3_VERSION)) + +(defconst *sj3-error-alist* + '( + (1 :SJ3_SERVER_DEAD + "$B%5!<%P$,;`$s$G$$$^$9!#(B") + (2 :SJ3_SOCK_OPEN_FAIL + "socket$B$N(Bopen$B$K<:GT$7$^$7$?!#(B") + (6 :SJ3_ALLOC_FAIL + "$B%a%b%j(Balloc$B$G<:GT$7$^$7$?!#(B") + (7 :SJ3_ILLEGAL_COMMAND + "$B%3%^%s%I$,4V0c$C$F$$$k(B") + (12 :SJ3_BAD_HOST + " $B%[%9%HL>$,$J$$(B ") + (13 :SJ3_BAD_USER + " $B%f!<%6L>$,$J$$(B ") + (31 :SJ3_NOT_A_DICT + "$B@5$7$$<-=q$G$O$"$j$^$;$s!#(B") + (35 :SJ3_NO_EXIST + "$B%U%!%$%k$,B8:_$7$^$;$s!#(B") + (37 :SJ3_OPENF_ERR + "$B%U%!%$%k$,%*!<%W%s$G$-$^$;$s!#(B") + (39 :SJ3_PARAMR + "$B%U%!%$%k$NFI$_9~$_8"8B$,$"$j$^$;$s!#(B") + (40 :SJ3_PARAMW + "$B%U%!%$%k$N=q$-9~$_8"8B$,$"$j$^$;$s!#(B") + (71 :SJ3_NOT_A_USERDICT + "$B;XDj$5$l$F<-=q$O!"%f!<%6!<<-=q$G$O$"$j$^$;$s!#(B") + (72 :SJ3_RDONLY + "$B%j!<%I%*%s%j!<$N<-=q$KEPO?$7$h$&$H$7$^$7$?!#(B") + (74 :SJ3_BAD_YOMI + "$BFI$_$KITE,Ev$JJ8;z$,4^$^$l$F$$$^$9!#(B") + (75 :SJ3_BAD_KANJI + "$B4A;z$KITE,Ev$JJ8;z$,4^$^$l$F$$$^$9!#(B") + (76 :SJ3_BAD_HINSHI + "$B;XDj$5$l$?IJ;lHV9f$,$"$j$^$;$s!#(B") + (82 :SJ3_WORD_ALREADY_EXIST + "$B;XDj$5$l$?C18l$O$9$G$KB8:_$7$F$$$^$9!#(B") + (84 :SJ3_JISHOTABLE_FULL + "$B<-=q%F!<%V%k$,0lGU$G$9!#(B") + (92 :SJ3_WORD_NO_EXIST + "$B;XDj$5$l$?C18l$,B8:_$7$^$;$s!#(B") + (102 :SJ3_MKDIR_FAIL + " $B%G%#%l%/%H%j$r:n$jB;$J$C$?(B ") + )) + +(defun sj3-error-symbol (code) + (let ((pair (assoc code *sj3-error-alist*))) + (if (null pair) + (list ':sj3-unknown-error-code code) + (car (cdr pair))))) +