1 ;; Sj3 server interface for Egg
2 ;; Coded by K.Ishii, Sony Corp. (kiyoji@sm.sony.co.jp)
4 ;; This file is part of Egg on Mule (Multilingual Environment)
6 ;; Egg is distributed in the forms of patches to GNU
7 ;; Emacs under the terms of the GNU EMACS GENERAL PUBLIC
8 ;; LICENSE which is distributed along with GNU Emacs by the
9 ;; Free Software Foundation.
11 ;; Egg is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied
13 ;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 ;; PURPOSE. See the GNU EMACS GENERAL PUBLIC LICENSE for
17 ;; You should have received a copy of the GNU EMACS GENERAL
18 ;; PUBLIC LICENSE along with Nemacs; see the file COPYING.
19 ;; If not, write to the Free Software Foundation, 675 Mass
20 ;; Ave, Cambridge, MA 02139, USA.
22 ;;; Ported to XEmacs 2-December, 1997.
25 ;;; Mule - Sj3 server interface in elisp
28 (provide 'egg-sj3-client)
30 ;;;;
\e$B=$@5%a%b!(!(
\e(B
32 ;;; Aug-4-94 by K.Ishii
33 ;;; Bug fixed in sj3-put-kata.
35 ;;; Apr-6-94 by N.Tanaka
36 ;;; Add version 2(japanese EUC) protocol
38 ;;; Jun-16-93 by H.Shirasaki <sirasaki@rd.ecip.osaka-u.ac.jp>
39 ;;; In sj3-bunsetu-yomi-equal, typo fixed.
41 ;;; Apr-6-93 by T.Saneto <sanewo@pdp.crl.sony.co.jp>
42 ;;; Bug fixed in sj3-bunsetu-yomi-equal.
44 ;;; Mar-19-93 by K.Ishii
45 ;;; Changed sj3-server-dict-info for edit-dict
47 ;;; Aug-6-92 by K.Ishii
48 ;;;
\e$BF|K\8lH=Dj$K
\e(B lc-jp
\e$B$r;H$&$h$&$KJQ99
\e(B
50 ;;; Jul-30-92 by K.Ishii
51 ;;;
\e$BD9$$J8>O$rJQ49$9$k$H$-$K5/$3$k
\e(B "Args out of range"
\e$B%(%i!<$N=$@5
\e(B
52 ;;;
\e$BEPO?$7$?F0;l$N:o=|$,$G$-$k$h$&$K
\e(B sj3-server-dict-info
\e$B$N=$@5
\e(B
53 ;;; sj3serv
\e$B$KEO$9%W%m%0%i%`L>$NJQ99
\e(B
55 ;;; Jun-2-92 by K.Ishii
56 ;;; Mule
\e$BMQ$KJQ99
\e(B
58 ;;; Dec-12-91 by K.Ishii
59 ;;;
\e$BJ8@a3X=,$,$&$^$/$G$-$J$$$3$H$,$"$k$?$a!"
\e(Bsj3-result-buffer
\e$B$rJQ99
\e(B
61 ;;; sj3-get-stdy
\e$B$G
\e(B "Count exceed."
\e$B%(%i!<$rNI$/5/$3$9$N$G:o=|
\e(B
63 ;;; Nov-26-91 by K.Ishii
64 ;;; sj3-server-open
\e$B$G
\e(B host_name
\e$B$H
\e(B user_name
\e$B$rEO$9=gHV$N=$@5
\e(B
66 ;;; sj3-server-henkan-next
\e$B$r<B9T$7$F$h$/5/$3$k
\e(B "Count exceed."
\e$B$H$$$&
\e(B
67 ;;;
\e$B%P%0$N=$@5
\e(B
69 ;;; sj3-server-henkan-next
\e$B$G0l3gJQ49$HJ8@aJQ49$GBh0l8uJd$,0c$C$?>l9g
\e(B
70 ;;;
\e$B$K5/$3$k%P%0$N=$@5
\e(B(
\e$B$3$l$KH<$$J8@a3X=,
\e(B sj3-server-b-study
\e$B$N=$@5
\e(B)
73 ;;; Sj3 daemon command constants
76 (defconst SJ3_OPEN 1 "
\e$BMxMQ<TEPO?
\e(B")
77 (defconst SJ3_CLOSE 2 "
\e$BMxMQ<T:o=|
\e(B")
79 (defconst SJ3_DICADD 11 "
\e$B<-=qDI2C
\e(B")
80 (defconst SJ3_DICDEL 12 "
\e$B<-=q:o=|
\e(B")
82 (defconst SJ3_OPENSTDY 21 "
\e$B3X=,%U%!%$%k%*!<%W%s
\e(B")
83 (defconst SJ3_CLOSESTDY 22 "
\e$B3X=,%U%!%$%k%/%m!<%:
\e(B")
84 (defconst SJ3_STDYSIZE 23 "")
86 (defconst SJ3_LOCK 31 "
\e$B<-=q%m%C%/
\e(B")
87 (defconst SJ3_UNLOCK 32 "
\e$B<-=q%"%s%m%C%/
\e(B")
89 (defconst SJ3_BEGIN 41 "
\e$BJQ493+;O
\e(B")
90 (defconst SJ3_BEGIN_EUC 111 "
\e$BJQ493+;O
\e(B")
92 (defconst SJ3_TANCONV 51 "
\e$B:FJQ49!JJ8@a?-=L!K
\e(B")
93 (defconst SJ3_TANCONV_EUC 112 "
\e$B:FJQ49!JJ8@a?-=L!K
\e(B")
94 (defconst SJ3_KOUHO 54 "
\e$B8uJd
\e(B")
95 (defconst SJ3_KOUHO_EUC 115 "
\e$B8uJd
\e(B")
96 (defconst SJ3_KOUHOSU 55 "
\e$B8uJd?t
\e(B")
97 (defconst SJ3_KOUHOSU_EUC 116 "
\e$B8uJd?t
\e(B")
99 (defconst SJ3_STDY 61 "
\e$BJ8@a3X=,
\e(B")
100 (defconst SJ3_END 62 "
\e$BJ8@aD93X=,
\e(B")
101 (defconst SJ3_END_EUC 117 "
\e$BJ8@aD93X=,
\e(B")
103 (defconst SJ3_WREG 71 "
\e$BC18lEPO?
\e(B")
104 (defconst SJ3_WREG_EUC 118 "
\e$BC18lEPO?
\e(B")
105 (defconst SJ3_WDEL 72 "
\e$BC18l:o=|
\e(B")
106 (defconst SJ3_WDEL_EUC 119 "
\e$BC18l:o=|
\e(B")
108 (defconst SJ3_MKDIC 81 "")
109 (defconst SJ3_MKSTDY 82 "")
110 (defconst SJ3_MKDIR 83 "")
111 (defconst SJ3_ACCESS 84 "")
113 (defconst SJ3_WSCH 91 "
\e$BC18l8!:w
\e(B")
114 (defconst SJ3_WSCH_EUC 120 "
\e$BC18l8!:w
\e(B")
115 (defconst SJ3_WNSCH 92 "")
116 (defconst SJ3_WNSCH_EUC 121 "")
118 (defconst SJ3_VERSION 103 "")
120 ;;; Sj3 server version error
121 (defconst SJ3_DifferentVersion 11 "")
122 (defvar *sj3-current-server-version* nil)
124 (defvar sj3-server-buffer nil "Buffer associated with Sj3 server process.")
126 (defvar sj3-server-process nil "Sj3 Kana Kanji hankan process.")
128 (defvar sj3-command-tail-position nil)
129 (defvar sj3-command-buffer nil)
131 (defvar sj3-result-buffer nil)
132 (defvar sj3-henkan-string nil)
133 (defvar sj3-bunsetu-suu nil)
135 (defvar sj3-return-code nil)
136 (defvar sj3-error-code nil)
138 (defvar sj3-stdy-size nil)
139 (defvar sj3-user-dict-list nil)
140 (defvar sj3-sys-dict-list nil)
141 (defvar sj3-yomi-llist nil)
144 ;;; Put data into buffer
147 (defun sj3-put-4byte (integer)
148 (insert (logand 255 (ash integer -24))
149 (logand 255 (ash integer -16))
150 (logand 255 (ash integer -8))
151 (logand 255 (ash integer 0)) ))
153 (defun sj3-put-string (str)
156 (defun sj3-put-string* (str)
157 (let ((sstr (if (= *sj3-current-server-version* 2)
158 (encode-coding-string str 'euc-japan)
159 (encode-coding-string str 'shift_jis))))
163 ;;; Get data from buffer
166 (defun sj3-get-4byte ()
168 (let ((c 0) (point (point)))
169 ;;;(goto-char (point-min))
170 (while (< (point-max) (+ point 4))
171 (accept-process-output)
172 ;;(if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed.")))
176 (let ((point (point)))
177 (if (not (or (and (= (char-after point) 0)
178 (< (char-after (+ point 1)) 128))
179 (and (= (char-after point) 255)
180 (<= 128 (char-after (+ point 1))))))
181 (error "sj3-get-4byte: integer range overflow."))
184 (lsh (char-after point) 24)
185 (lsh (char-after (+ point 1)) 16)
186 (lsh (char-after (+ point 2)) 8)
187 (lsh (char-after (+ point 3)) 0))
188 (goto-char (+ (point) 4)))))
190 (defun sj3-get-byte ()
191 (let ((c 0) (point (point)))
192 (while (< (point-max) (1+ point))
193 (accept-process-output)
194 ;;(if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed.")))
198 (lsh (char-after point) 0)
201 (defun sj3-get-string ()
202 (let ((point (point)))
203 (skip-chars-forward "^\0")
206 (accept-process-output)
207 ;;(if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed")))
209 (skip-chars-forward "^\0")))
211 (buffer-substring point (point))
214 (defun sj3-get-string* ()
215 (let ((point (point)))
216 (sj3-get-convert-string)
217 (buffer-substring point (1- (point)))))
219 (defun sj3-get-convert-string ()
220 (let ((point (point)) (c 0) str)
221 (while (not (search-forward "\0" nil t))
222 (accept-process-output)
224 ;;(if (= c 10) (if t (progn (sit-for 0) (setq c 0)) (error "Count exceed")))
226 (setq str (buffer-substring point (1- (point))))
227 (delete-region point (point))
228 (insert (if (= *sj3-current-server-version* 2)
229 (decode-coding-string str 'euc-japan)
230 (decode-coding-string str 'shift_jis)) 0)))
232 (defun sj3-get-stdy ()
233 (let ((c 0) (point (point)))
234 (while (< (point-max) (+ point sj3-stdy-size))
235 (accept-process-output)
236 ;;(if (>= c 10) (progn (sit-for 0) (setq c 0))) ;;; delete error
238 (goto-char (+ point sj3-stdy-size))))
241 ;;; Sj3 Server Command Primitives
244 (defun sj3-command-start (command)
245 (set-buffer sj3-command-buffer)
246 (goto-char (point-min))
247 (if (not (= (point-max) (+ sj3-command-tail-position 1024)))
248 (error "sj3 command start error"))
249 (delete-region (point-min) sj3-command-tail-position)
250 (sj3-put-4byte command))
252 (defun sj3-command-reset ()
256 (if (fboundp 'set-process-coding-system)
257 (set-process-coding-system sj3-server-process 'binary 'binary))
258 ;;; for Nemacs 3.0 and later
259 ;; (if (fboundp 'set-process-kanji-code)
260 ;; (set-process-kanji-code sj3-server-process 0))
261 (set-buffer sj3-command-buffer)
262 ;; (setq mc-flag nil) ;;; for Mule
263 ;; (setq kanji-flag nil)
264 ;; (setq kanji-fileio-code 0) ;;; for Nemacs 2.1
265 (buffer-disable-undo sj3-command-buffer)
267 (setq sj3-command-tail-position (point-min))
268 (let ((max 1024) (i 0))
273 (defun sj3-command-end ()
274 (set-buffer sj3-server-buffer)
276 (set-buffer sj3-command-buffer)
277 (setq sj3-command-tail-position (point))
278 ;; (process-send-region sj3-server-process (point-min)
279 ;; (+ (point-min) (lsh (1+ (lsh (- (point) (point-min)) -10)) 10)))
280 (process-send-region sj3-server-process (point-min) (1+ (point)))
284 ;;; Sj3 Server Reply primitives
287 (defun sj3-get-result ()
288 (set-buffer sj3-server-buffer)
290 (let ((focus-follows-mouse t))
291 (accept-process-output sj3-server-process))
293 (goto-char (point-min)))
295 (defun sj3-get-return-code ()
296 (setq sj3-return-code (sj3-get-4byte))
297 (setq sj3-error-code (if (= sj3-return-code 0) nil
298 (sj3-error-symbol sj3-return-code)))
299 (if sj3-error-code nil
303 ;;; Sj3 Server Interface: sj3-server-open
306 ;(defvar *sj3-server-max-kana-string-length* 1000)
307 ;(defvar *sj3-server-max-bunsetu-suu* 1000)
309 (defvar *sj3-server-version* 2)
310 (setq *sj3-server-version* 2)
311 (defvar *sj3-program-name* "sj3-egg-m")
312 (defvar *sj3-service-name* "sj3")
314 (defun sj3-server-open (server-host-name login-name)
315 (if (sj3-server-active-p) t
316 (let ((server_version *sj3-server-version*)
318 (if (or (null server-host-name)
319 (equal server-host-name "")
320 (equal server-host-name "unix"))
324 (if (or (null login-name) (equal login-name ""))
327 (host_name (system-name))
330 (string-to-int (substring (make-temp-name "") 1 6))
331 *sj3-program-name*)))
332 (setq sj3-server-process
334 (open-network-stream "Sj3" " [Sj3 Output Buffer] "
335 sj3serv_name *sj3-service-name* )
337 (cond((string-match "Unknown host" (car (cdr var)))
338 (setq sj3-error-code (list ':SJ3_UNKNOWN_HOST
340 ((string-match "Unknown service" (car (cdr var)))
341 (setq sj3-error-code (list ':SJ3_UNKNOWN_SERVICE
342 *sj3-service-name*)))
343 (t ;;; "Host ... not respoding"
344 (setq sj3-error-code ':SJ3_SOCK_OPEN_FAIL)))
346 (if (null sj3-server-process) nil
347 (process-kill-without-query sj3-server-process)
348 (setq sj3-server-buffer (get-buffer " [Sj3 Output Buffer] "))
349 (setq sj3-command-buffer (get-buffer-create " [Sj3 Command Buffer] "))
350 (setq sj3-result-buffer (get-buffer-create " [Sj3 Result Buffer] "))
354 (if (fboundp 'set-process-coding-system)
355 (set-process-coding-system
356 sj3-server-process 'binary 'binary))
358 ;; (if (fboundp 'set-process-kanji-code)
359 ;; (set-process-kanji-code sj3-server-process 0))
361 (set-buffer sj3-server-buffer)
362 ;; (setq mc-flag nil) ;;; for Mule
363 ;; (setq kanji-flag nil)
365 ;; (setq kanji-fileio-code 0)
366 (buffer-disable-undo sj3-server-buffer)
369 (set-buffer sj3-result-buffer)
370 ;; (setq mc-flag nil) ;;; for Mule
371 ;; (setq kanji-flag nil)
373 ;; (setq kanji-fileio-code 0)
374 (buffer-disable-undo sj3-result-buffer))
376 (set-buffer sj3-command-buffer)
377 ;; (setq mc-flag nil) ;;; for Mule
378 ;; (setq kanji-flag nil)
380 ;; (setq kanji-fileio-code 0)
381 (buffer-disable-undo sj3-command-buffer)
383 (setq sj3-command-tail-position (point-min))
384 (let ((max 1024) (i 0))
388 (sj3-clear-dict-list)
389 (sj3-command-start SJ3_OPEN)
390 (sj3-put-4byte server_version)
391 (sj3-put-string host_name)
392 (sj3-put-string user_name)
393 (sj3-put-string program_name)
396 (sj3-get-return-code)
397 (if (= sj3-return-code SJ3_DifferentVersion)
398 (progn (sj3-command-start SJ3_OPEN)
400 (sj3-put-string host_name)
401 (sj3-put-string user_name)
402 (sj3-put-string program_name)
405 (sj3-get-return-code)
406 (if (not (= sj3-return-code 0))
407 (sj3-connection-error)
411 (if (or (= sj3-return-code 0) (> -1 sj3-return-code))
412 (progn (setq *sj3-current-server-version* 1)
413 (if (not (= sj3-return-code 0))
414 (setq *sj3-current-server-version* (- 0 sj3-return-code))
421 (defun sj3-server-active-p ()
422 (and sj3-server-process
423 (eq (process-status sj3-server-process) 'open)))
425 (defun sj3-connection-error ()
426 (setq sj3-error-code ':sj3-no-connection)
427 (setq sj3-return-code -1)
430 (defun sj3-zero-arg-command (op)
431 (if (sj3-server-active-p)
433 (sj3-command-start op)
436 (sj3-get-return-code))
437 (sj3-connection-error)))
439 (defun sj3-server-close ()
441 (while (and (sj3-server-active-p) (setq dict-no (car sj3-sys-dict-list)))
442 (sj3-server-close-dict dict-no)
443 (setq sj3-sys-dict-list (cdr sj3-sys-dict-list)))
444 (while (and (sj3-server-active-p) (setq dict-no (car sj3-user-dict-list)))
445 (sj3-server-close-dict dict-no)
446 (setq sj3-user-dict-list (cdr sj3-user-dict-list)))
447 (sj3-clear-dict-list))
448 (sj3-server-close-stdy)
449 (sj3-zero-arg-command SJ3_CLOSE)
450 (if (sj3-server-active-p)
451 (delete-process sj3-server-process))
452 (if sj3-server-buffer
453 (kill-buffer sj3-server-buffer))
454 (if sj3-command-buffer
455 (kill-buffer sj3-command-buffer))
456 (if sj3-result-buffer
457 (kill-buffer sj3-result-buffer))
458 (setq sj3-server-process nil)
459 (setq sj3-server-buffer nil)
460 (setq sj3-command-buffer nil)
461 (setq sj3-result-buffer nil))
463 (defun sj3-clear-dict-list ()
464 (setq sj3-sys-dict-list nil)
465 (setq sj3-user-dict-list nil))
467 (or (fboundp 'si:kill-emacs)
468 (fset 'si:kill-emacs (symbol-function 'kill-emacs)))
470 (defun kill-emacs (&optional arg)
472 (if (sj3-server-active-p)
477 (defun sj3-get-stdy-size ()
478 (sj3-zero-arg-command SJ3_STDYSIZE)
479 (if (not (= sj3-return-code 0)) nil
480 (setq sj3-stdy-size (sj3-get-4byte))))
482 (defun sj3-put-stdy-dmy ()
484 (while (< i sj3-stdy-size)
488 ;;; Sj3 Result Buffer's layout:
490 ;;; { length:4 kana 0 kouhoSuu:4 kouhoNo:4
491 ;;; {studyData kanji 0 } ...
495 (defun sj3-skip-length ()
496 (goto-char (+ (point) 4)))
498 (defun sj3-skip-4byte ()
499 (goto-char (+ (point) 4)))
501 (defun sj3-skip-yomi ()
502 (skip-chars-forward "^\0") (forward-char 1))
504 (defun sj3-skip-stdy ()
505 (goto-char (+ (point) sj3-stdy-size)))
510 (defun sj3-server-henkan-begin (henkan-string)
511 (if (not (sj3-server-active-p)) (sj3-connection-error)
512 (let ((inhibit-quit t) mb-str)
514 (setq sj3-henkan-string henkan-string)
515 (if (= *sj3-current-server-version* 2)
516 (setq mb-str (encode-coding-string henkan-string 'euc-japan))
517 (setq mb-str (encode-coding-string henkan-string 'shift_jis))
519 (set-buffer sj3-result-buffer)
521 (setq sj3-bunsetu-suu 0)
522 (setq sj3-yomi-llist nil)
523 (goto-char (point-min))
524 (if (= *sj3-current-server-version* 2)
525 (sj3-command-start SJ3_BEGIN_EUC)
526 (sj3-command-start SJ3_BEGIN)
528 (sj3-put-string mb-str)
531 (sj3-get-return-code)
532 (if (not (= sj3-return-code 0)) nil
533 (let ((yp 0) p0 yl offset)
535 (set-buffer sj3-result-buffer)
536 (delete-region (point) (point-max))
538 (insert sj3-henkan-string 0 0 0 0)
540 (set-buffer sj3-server-buffer)
541 (while (> (setq yl (sj3-get-byte)) 0)
542 (let ((startp (point))
543 (ystr (substring mb-str yp (+ yp yl)))
546 (if (= *sj3-current-server-version* 2)
547 (setq yl (length (decode-coding-string ystr 'euc-japan)))
548 (setq yl (length (decode-coding-string ystr 'shift_jis)))
550 (sj3-get-stdy) ;;; skip study-data
551 (sj3-get-convert-string)
553 (set-buffer sj3-result-buffer)
556 (setq sj3-yomi-llist (append sj3-yomi-llist (list yl)))
558 (sj3-put-4byte 1) ;;; kouho suu
559 (sj3-put-4byte 0) ;;; current kouho number
560 (insert-buffer-substring sj3-server-buffer startp endp)
561 ;;; insert study data and kanji strings
562 (setq offset (- (point) p0))
563 (goto-char p0) (sj3-put-4byte offset)
564 (goto-char (+ (point) offset))
565 (setq sj3-return-code (1+ sj3-return-code))
566 (set-buffer sj3-server-buffer)))
567 (setq sj3-bunsetu-suu sj3-return-code)))))))
571 (defun sj3-server-henkan-quit () t)
573 (defun sj3-get-yomi-suu-org ()
574 (if (setq sj3-yomi-llist (cdr sj3-yomi-llist))
581 (defun sj3-server-henkan-end (bunsetu-no)
582 (if (not (sj3-server-active-p)) (sj3-connection-error)
583 (let ((inhibit-quit t))
585 (let (length ystr len kouho-no kouho-suu p0 (ylist nil))
586 (set-buffer sj3-result-buffer)
587 (goto-char (point-min))
588 (let ((max (if (and (integerp bunsetu-no)
590 (<= bunsetu-no sj3-bunsetu-suu))
595 (setq length (sj3-get-4byte))
597 (setq ystr (sj3-get-string))
598 (setq len (1- (- (point) p0)))
599 (setq kouho-suu (sj3-get-4byte)) ;;; kouho suu
600 (setq kouho-no (sj3-get-4byte))
601 (if (and (> kouho-no 0)
602 (< kouho-no (- kouho-suu 2))
604 (sj3-server-b-study kouho-no))
605 (setq ylist (cons (list len ystr kouho-suu (point)) ylist))
606 (goto-char (+ p0 length))
608 (setq ylist (nreverse ylist))
610 (let ((yp 0) (op 0) (ydata (car ylist)) (ol (car sj3-yomi-llist)))
612 (let ((yl (nth 0 ydata)))
613 (setq ylist (cdr ylist))
614 (if (and (= yp op) (= yl ol))
615 (let ((pp (+ yp yl)))
618 (setq ydata (car ylist))
619 (setq ol (sj3-get-yomi-suu-org)))
620 (let ((str (nth 1 ydata))
622 (setq ydata (car ylist))
626 (setq ol (sj3-get-yomi-suu-org)))
627 (if (or (= ent 2) (= (nth 2 ydata) 2)) nil
628 (let ((sub (- op yp)) (yl1 (nth 0 ydata)))
629 (set-buffer sj3-result-buffer)
630 (goto-char (nth 3 ydata))
631 (sj3-server-cl-study str (nth 1 ydata))
632 (if (and (not (= sub yl1)) (not (= sub (- yl1 ol))))
635 (setq ylist (cdr ylist))
636 (setq ydata (car ylist))
639 (setq ol (sj3-get-yomi-suu-org))))))))
641 (if (or (null ydata) (= (nth 0 ydata) ol) (= (nth 2 ydata) 2))
643 (goto-char (nth 3 ydata))
644 (sj3-server-cl-study (nth 1 ydata) "")))))))))
646 (defun sj3-server-cl-study (str1 str2)
647 (if (not (sj3-server-active-p)) (sj3-connection-error)
649 (if (= *sj3-current-server-version* 2)
650 (sj3-command-start SJ3_END_EUC)
651 (sj3-command-start SJ3_END))
652 (sj3-put-string* str1)
653 (sj3-put-string* str2)
654 (if (string= str2 "") (sj3-put-stdy-dmy)
656 (set-buffer sj3-result-buffer)
658 (set-buffer sj3-command-buffer)
659 (insert-buffer-substring sj3-result-buffer p0 (+ p0 sj3-stdy-size))))
662 (sj3-get-return-code))))
664 (defun sj3-server-b-study (no)
665 (if (not (sj3-server-active-p)) (sj3-connection-error)
668 (set-buffer sj3-result-buffer)
674 (sj3-command-start SJ3_STDY)
675 (insert-buffer-substring sj3-result-buffer p0 (+ p0 sj3-stdy-size))
678 (sj3-get-return-code)))))
680 (defun sj3-result-goto-bunsetu (bunsetu-no)
681 (goto-char (point-min))
683 (while (< i bunsetu-no)
684 (setq length (sj3-get-4byte))
685 (goto-char (+ (point) length))
691 (defun sj3-server-henkan-kakutei (bunsetu-no jikouho-no)
692 (cond((not (sj3-server-active-p)) (sj3-connection-error))
693 ((or (< bunsetu-no 0) (<= sj3-bunsetu-suu bunsetu-no))
696 (let ((inhibit-quit t))
698 (set-buffer sj3-result-buffer)
700 (sj3-result-goto-bunsetu bunsetu-no)
703 (setq kouho-suu (sj3-get-4byte))
704 (if (or (< jikouho-no 0) (<= kouho-suu jikouho-no)) nil
705 (delete-char 4) (sj3-put-4byte jikouho-no)
711 (defun sj3-server-henkan-next (bunsetu-no)
712 (if (not (sj3-server-active-p)) (sj3-connection-error)
713 (let ((inhibit-quit t))
715 (let (p0 p1 kouho-suu length ystr)
716 (set-buffer sj3-result-buffer)
717 (sj3-result-goto-bunsetu bunsetu-no)
720 (setq ystr (sj3-get-string))
722 (setq kouho-suu (sj3-get-4byte))
723 (if (> kouho-suu 1) t
724 (let ((ksuu (sj3-server-henkan-kouho ystr)) (startp 0) endp)
725 (if (< ksuu 0) sj3-return-code
727 (set-buffer sj3-result-buffer)
730 (setq kanji (sj3-get-string))
733 (set-buffer sj3-server-buffer)
735 (setq startp (point))
737 (let ((kkanji (sj3-get-string*)))
738 (if (equal kanji kkanji)
739 (setq startp (point))
740 (setq ksuu (1+ ksuu))
746 (sj3-get-convert-string)
748 (setq endp (point))))
749 (set-buffer sj3-result-buffer)
751 (insert-buffer-substring sj3-server-buffer startp endp))
754 (setq length (- (point) p0))
757 (if (<= ksuu 0)(sj3-put-4byte 3) ;;;
758 (sj3-put-4byte (+ ksuu 2))) ;;; put kouho-suu
761 (sj3-put-4byte length))
764 (defun sj3-server-henkan-kouho (str)
765 (if (not (sj3-server-active-p)) -1
766 (let ((mb-str (if (= *sj3-current-server-version* 2)
767 (encode-coding-string str 'euc-japan)
768 (encode-coding-string str 'shift_jis)))
770 (setq len (length mb-str))
771 (setq kouho-suu (sj3-server-henkan-kouho-suu len mb-str))
772 (if (<= kouho-suu 0) nil
773 (if (= *sj3-current-server-version* 2)
774 (sj3-command-start SJ3_KOUHO_EUC)
775 (sj3-command-start SJ3_KOUHO))
777 (sj3-put-string mb-str)
780 (sj3-get-return-code)
781 (if (not (= sj3-return-code 0)) -1))
784 (defun sj3-put-kata (str)
785 (setq str (copy-sequence str))
786 (let ((i 0) (len (length str)) ch)
788 (setq ch (aref str i))
790 (if (and (/= ?
\e$B!<
\e(B ch)
791 (string-match "\\cH" (char-to-string ch)))
792 (make-char (find-charset 'japanese-jisx0208) 37
793 (nth 2 (split-char ch)))
798 (defun sj3-server-henkan-kouho-suu (yomi-length yomi)
799 (if (not (sj3-server-active-p)) -1
801 (if (= *sj3-current-server-version* 2)
802 (sj3-command-start SJ3_KOUHOSU_EUC)
803 (sj3-command-start SJ3_KOUHOSU))
804 (sj3-put-4byte yomi-length)
805 (sj3-put-string yomi)
808 (sj3-get-return-code)
809 (if (not (= sj3-return-code 0)) -1
815 (defun sj3-server-bunsetu-henkou (bunsetu-no bunsetu-length)
816 (cond((not (sj3-server-active-p)) (sj3-connection-error))
817 ((or (< bunsetu-no 0) (<= sj3-bunsetu-suu bunsetu-no))
820 (let ((inhibit-quit t))
822 (let (yp0 p0 p1 str len1 len2 bunsetu-suu (bno bunsetu-no))
823 (set-buffer sj3-result-buffer)
824 (setq yp0 (sj3-yomi-point bunsetu-no))
826 (setq str (sj3-get-yomi* yp0 bunsetu-length))
827 (setq len1 (length str))
828 (setq bunsetu-suu sj3-bunsetu-suu)
831 (while (and (< bno sj3-bunsetu-suu) (> len2 0))
832 (setq length (sj3-get-4byte))
834 (skip-chars-forward "^\0")
835 (setq len2 (- len2 (- (point) point)))
836 (goto-char (+ point length))
837 (setq bno (1+ bno))))
839 (delete-region p0 p1)
840 (setq sj3-bunsetu-suu (- sj3-bunsetu-suu (- bno bunsetu-no)))
841 (if (= (sj3-put-tanconv str) 0)
843 (let ((len (- 0 len2)) (yp1 (+ yp0 len1))
845 (if (or (> bno (1+ bunsetu-no)) (= bno bunsetu-suu))
846 (setq ystr (sj3-get-yomi yp1 len))
848 (set-buffer sj3-result-buffer)
850 (setq length (sj3-get-4byte))
851 (skip-chars-forward "^\0")
852 (setq ll (+ len (- (point) (+ p0 4))))
853 (setq p1 (+ p0 (+ length 4)))
854 (setq ystr (sj3-get-yomi yp1 ll))
855 (setq mb-str (if (= *sj3-current-server-version* 2)
856 (encode-coding-string ystr 'euc-japan)
857 (encode-coding-string ystr 'shift_jis)))
858 (setq i (sj3-server-henkan-kouho-suu
859 (length mb-str) mb-str))
860 (set-buffer sj3-result-buffer)
861 (if (= i 0) (setq ystr (sj3-get-yomi yp1 len))
862 (delete-region p0 p1)
863 (setq sj3-bunsetu-suu (1- sj3-bunsetu-suu))
866 (sj3-put-tanconv ystr))))
867 (if (= sj3-return-code -1) nil
868 sj3-bunsetu-suu)))))))
870 (defun sj3-put-tanconv (str)
871 (let ((point (point)) len ksuu
872 (mb-str (if (= *sj3-current-server-version* 2)
873 (encode-coding-string str 'euc-japan)
874 (encode-coding-string str 'shift_jis))))
875 (setq len (length mb-str))
876 (setq ksuu (sj3-server-henkan-kouho-suu len mb-str))
879 (set-buffer sj3-result-buffer)
882 (not (sj3-server-tanconv len mb-str)))
883 (put-kata-and-hira str)
885 (set-buffer sj3-result-buffer)
888 (set-buffer sj3-server-buffer)
892 (sj3-get-convert-string)
894 (set-buffer sj3-result-buffer)
895 (insert-buffer-substring sj3-server-buffer p0 p1)))
896 (set-buffer sj3-result-buffer)
897 (setq offset (- (point) point))
898 (goto-char point) (sj3-put-4byte offset)
899 (goto-char (+ (point) offset))
900 (setq sj3-bunsetu-suu (1+ sj3-bunsetu-suu))))
903 (defun sj3-server-tanconv (len str)
904 (if (not (sj3-server-active-p)) (sj3-connection-error)
905 (let ((inhibit-quit t))
906 (if (= *sj3-current-server-version* 2)
907 (sj3-command-start SJ3_TANCONV_EUC)
908 (sj3-command-start SJ3_TANCONV))
913 (sj3-get-return-code))))
915 (defun put-kata-and-hira (str)
922 (defun sj3-get-yomi (offset length)
923 (substring sj3-henkan-string offset (+ offset length)))
925 (defun sj3-get-yomi* (offset bunsetu-length)
926 (let ((i 0) (c offset))
927 (while (< i bunsetu-length)
928 (let ((ch (substring sj3-henkan-string c (1+ c))))
929 (if (string= ch "\222");;lc-jp
933 (substring sj3-henkan-string offset c)))
935 (defun sj3-bunsetu-suu () sj3-bunsetu-suu)
937 (defun sj3-bunsetu-kanji (bunsetu-no &optional buffer)
938 (let ((savebuffer (current-buffer)))
941 (set-buffer sj3-result-buffer)
942 (if (or (< bunsetu-no 0)
943 (<= sj3-bunsetu-suu bunsetu-no))
945 (sj3-result-goto-bunsetu bunsetu-no)
950 (rksuu (- (sj3-get-4byte) 2)) ;;; real kouho-suu
951 (max (sj3-get-4byte))) ;;; kouho-number
961 (skip-chars-forward "^\0") (setq p2 (point))
964 (concat (buffer-substring p1 p2))
966 (insert-buffer-substring sj3-result-buffer p1 p2)
968 (set-buffer savebuffer))))
970 (defun sj3-bunsetu-kanji-length (bunsetu-no)
972 (set-buffer sj3-result-buffer)
973 (if (or (< bunsetu-no 0)
974 (<= sj3-bunsetu-suu bunsetu-no))
976 (sj3-result-goto-bunsetu bunsetu-no)
981 (rksuu (- (sj3-get-4byte) 2)) ;;; real kouho-suu
982 (max (sj3-get-4byte))) ;;; kouho-number
992 (skip-chars-forward "^\0")
996 (defun sj3-bunsetu-yomi-moji-suu (bunsetu-no)
998 (set-buffer sj3-result-buffer)
999 (if (or (< bunsetu-no 0)
1000 (<= sj3-bunsetu-suu bunsetu-no))
1002 (sj3-result-goto-bunsetu bunsetu-no)
1004 ;; (1- (- (point-max) (point))))))
1006 (while (not (char-equal (int-to-char 0) (char-after)))
1011 (defun sj3-yomi-point (bunsetu-no)
1012 (let ((i 0) (len 0) point length)
1013 (goto-char (point-min))
1014 (while (< i bunsetu-no)
1015 (setq length (sj3-get-4byte))
1016 (setq point (point))
1017 (skip-chars-forward "^\0")
1018 (setq len (+ len (- (point) point)))
1019 (goto-char (+ point length))
1023 (defun sj3-bunsetu-yomi (bunsetu-no &optional buffer)
1024 (let ((savebuff (current-buffer)))
1027 (set-buffer sj3-result-buffer)
1028 (if (or (< bunsetu-no 0)
1029 (<= sj3-bunsetu-suu bunsetu-no))
1031 (sj3-result-goto-bunsetu bunsetu-no)
1035 (skip-chars-forward "^\0")
1036 (if (null buffer ) (buffer-substring p1 (point))
1039 (insert-buffer-substring sj3-result-buffer p1 p2)
1041 (set-buffer savebuff))))
1043 (defun sj3-bunsetu-yomi-equal (bunsetu-no yomi)
1045 (set-buffer sj3-result-buffer)
1046 (if (or (< bunsetu-no 0)
1047 (<= sj3-bunsetu-suu bunsetu-no))
1049 (sj3-result-goto-bunsetu bunsetu-no)
1051 (looking-at (regexp-quote yomi))))) ;93.4.6 by T.Saneto
1053 (defun sj3-bunsetu-kouho-suu (bunsetu-no)
1055 (set-buffer sj3-result-buffer)
1056 (if (or (< bunsetu-no 0)
1057 (<= sj3-bunsetu-suu bunsetu-no))
1059 (sj3-result-goto-bunsetu bunsetu-no)
1064 (defun sj3-bunsetu-kouho-list (bunsetu-no)
1066 (set-buffer sj3-result-buffer)
1067 (if (or (< bunsetu-no 0)
1068 (<= sj3-bunsetu-suu bunsetu-no))
1070 (sj3-result-goto-bunsetu bunsetu-no)
1073 (let ((max (sj3-get-4byte)) (i 0) (result nil) p0)
1074 (sj3-skip-4byte) ;;; current kouhou number
1078 (skip-chars-forward "^\0")
1080 (cons (concat (buffer-substring p0 (point)))
1086 (nreverse result)))))
1088 (defun sj3-bunsetu-kouho-number (bunsetu-no)
1090 (set-buffer sj3-result-buffer)
1091 (if (or (< bunsetu-no 0)
1092 (<= sj3-bunsetu-suu bunsetu-no))
1094 (sj3-result-goto-bunsetu bunsetu-no)
1101 (defun sj3-simple-command (op arg)
1102 (if (sj3-server-active-p)
1103 (let ((inhibit-quit t))
1105 (sj3-command-start op)
1109 (sj3-get-return-code)))
1110 (sj3-connection-error)))
1112 (defun sj3-server-open-dict (dict-file-name password)
1113 (if (not (sj3-server-active-p))(sj3-connection-error)
1114 (let ((inhibit-quit t))
1116 (sj3-command-start SJ3_DICADD)
1117 (sj3-put-string dict-file-name)
1118 (if (stringp password)
1119 (sj3-put-string password)
1123 (sj3-get-return-code)
1124 (if (not (= sj3-return-code 0)) nil
1125 (let ((dict-no (sj3-get-4byte)))
1126 (if (stringp password)
1127 (setq sj3-user-dict-list
1128 (append sj3-user-dict-list (list dict-no)))
1129 (setq sj3-sys-dict-list
1130 (append sj3-sys-dict-list (list dict-no))))
1133 (defun sj3-server-close-dict (dict-no)
1134 (if (not (sj3-server-active-p))(sj3-connection-error)
1135 (let ((inhibit-quit t))
1137 (sj3-command-start SJ3_DICDEL)
1138 (sj3-put-4byte dict-no)
1141 (sj3-get-return-code)))))
1143 (defun sj3-server-make-dict (dict-file-name)
1144 (if (not (sj3-server-active-p))(sj3-connection-error)
1145 (let ((inhibit-quit t))
1147 (sj3-command-start SJ3_MKDIC)
1148 (sj3-put-string dict-file-name)
1149 (sj3-put-4byte 2048) ;;; Index length
1150 (sj3-put-4byte 2048) ;;; Length
1151 (sj3-put-4byte 256) ;;; Number
1154 (sj3-get-return-code)))))
1156 (defun sj3-server-open-stdy (stdy-file-name)
1157 (if (not (sj3-server-active-p))(sj3-connection-error)
1158 (let ((inhibit-quit t))
1160 (sj3-command-start SJ3_OPENSTDY)
1161 (sj3-put-string stdy-file-name)
1165 (sj3-get-return-code)))))
1167 (defun sj3-server-close-stdy ()
1168 (sj3-zero-arg-command SJ3_CLOSESTDY))
1170 (defun sj3-server-make-stdy (stdy-file-name)
1171 (if (not (sj3-server-active-p))(sj3-connection-error)
1172 (let ((inhibit-quit t))
1174 (sj3-command-start SJ3_MKSTDY)
1175 (sj3-put-string stdy-file-name)
1176 (sj3-put-4byte 2048) ;;; Number
1177 (sj3-put-4byte 1) ;;; Step
1178 (sj3-put-4byte 2048) ;;; Length
1181 (sj3-get-return-code)))))
1183 (defun sj3-server-dict-add (dictno kanji yomi bunpo)
1184 (if (not (sj3-server-active-p))(sj3-connection-error)
1185 (let ((inhibit-quit t))
1187 (if (= *sj3-current-server-version* 2)
1188 (sj3-command-start SJ3_WREG_EUC)
1189 (sj3-command-start SJ3_WREG))
1190 (sj3-put-4byte dictno)
1191 (sj3-put-string* yomi)
1192 (sj3-put-string* kanji)
1193 (sj3-put-4byte bunpo)
1196 (sj3-get-return-code)))))
1198 (defun sj3-server-dict-delete (dictno kanji yomi bunpo)
1199 (if (not (sj3-server-active-p)) (sj3-connection-error)
1200 (let ((inhibit-quit t))
1202 (if (= *sj3-current-server-version* 2)
1203 (sj3-command-start SJ3_WDEL_EUC)
1204 (sj3-command-start SJ3_WDEL))
1205 (sj3-put-4byte dictno)
1206 (sj3-put-string* yomi)
1207 (sj3-put-string* kanji)
1208 (sj3-put-4byte bunpo)
1211 (sj3-get-return-code)))))
1213 (defun sj3-server-dict-info (dict-no)
1214 (if (not (sj3-server-active-p)) (sj3-connection-error)
1215 (let ((inhibit-quit t))
1218 (set-buffer sj3-server-buffer)
1219 (if (= *sj3-current-server-version* 2)
1220 (sj3-simple-command SJ3_WSCH_EUC dict-no)
1221 (sj3-simple-command SJ3_WSCH dict-no))
1222 (while (= sj3-return-code 0)
1224 (setq result (cons (list (sj3-get-string*)
1225 (sj3-get-string*) (sj3-get-4byte)) result))
1226 (if (= *sj3-current-server-version* 2)
1227 (sj3-simple-command SJ3_WNSCH_EUC dict-no)
1228 (sj3-simple-command SJ3_WNSCH dict-no)))
1229 (if (= sj3-return-code 111)
1230 (setq sj3-error-code nil))
1231 (nreverse result))))))
1233 (defun sj3-server-make-directory (dir-name)
1234 (if (not (sj3-server-active-p)) (sj3-connection-error)
1235 (let ((inhibit-quit t))
1237 (sj3-command-start SJ3_MKDIR)
1238 (sj3-put-string dir-name)
1241 (sj3-get-return-code)))))
1243 (defun sj3-server-file-access (file-name access-mode)
1244 (if (not (sj3-server-active-p)) (sj3-connection-error)
1245 (let ((inhibit-quit t))
1247 (sj3-command-start SJ3_ACCESS)
1248 (sj3-put-string file-name)
1249 (sj3-put-4byte access-mode)
1252 (setq sj3-error-code nil)
1256 (sj3-zero-arg-command SJ3_LOCK))
1258 (defun sj3_unlock ()
1259 (sj3-zero-arg-command SJ3_UNLOCK))
1261 (defun sj3_version ()
1262 (sj3-zero-arg-command SJ3_VERSION))
1264 (defconst *sj3-error-alist*
1267 "
\e$B%5!<%P$,;`$s$G$$$^$9!#
\e(B")
1268 (2 :SJ3_SOCK_OPEN_FAIL
1269 "socket
\e$B$N
\e(Bopen
\e$B$K<:GT$7$^$7$?!#
\e(B")
1271 "
\e$B%a%b%j
\e(Balloc
\e$B$G<:GT$7$^$7$?!#
\e(B")
1272 (7 :SJ3_ILLEGAL_COMMAND
1273 "
\e$B%3%^%s%I$,4V0c$C$F$$$k
\e(B")
1275 "
\e$B%[%9%HL>$,$J$$
\e(B ")
1277 "
\e$B%f!<%6L>$,$J$$
\e(B ")
1279 "
\e$B@5$7$$<-=q$G$O$"$j$^$;$s!#
\e(B")
1281 "
\e$B%U%!%$%k$,B8:_$7$^$;$s!#
\e(B")
1283 "
\e$B%U%!%$%k$,%*!<%W%s$G$-$^$;$s!#
\e(B")
1285 "
\e$B%U%!%$%k$NFI$_9~$_8"8B$,$"$j$^$;$s!#
\e(B")
1287 "
\e$B%U%!%$%k$N=q$-9~$_8"8B$,$"$j$^$;$s!#
\e(B")
1288 (71 :SJ3_NOT_A_USERDICT
1289 "
\e$B;XDj$5$l$F<-=q$O!"%f!<%6!<<-=q$G$O$"$j$^$;$s!#
\e(B")
1291 "
\e$B%j!<%I%*%s%j!<$N<-=q$KEPO?$7$h$&$H$7$^$7$?!#
\e(B")
1293 "
\e$BFI$_$KITE,Ev$JJ8;z$,4^$^$l$F$$$^$9!#
\e(B")
1295 "
\e$B4A;z$KITE,Ev$JJ8;z$,4^$^$l$F$$$^$9!#
\e(B")
1297 "
\e$B;XDj$5$l$?IJ;lHV9f$,$"$j$^$;$s!#
\e(B")
1298 (82 :SJ3_WORD_ALREADY_EXIST
1299 "
\e$B;XDj$5$l$?C18l$O$9$G$KB8:_$7$F$$$^$9!#
\e(B")
1300 (84 :SJ3_JISHOTABLE_FULL
1301 "
\e$B<-=q%F!<%V%k$,0lGU$G$9!#
\e(B")
1302 (92 :SJ3_WORD_NO_EXIST
1303 "
\e$B;XDj$5$l$?C18l$,B8:_$7$^$;$s!#
\e(B")
1304 (102 :SJ3_MKDIR_FAIL
1305 "
\e$B%G%#%l%/%H%j$r:n$jB;$J$C$?
\e(B ")
1308 (defun sj3-error-symbol (code)
1309 (let ((pair (assoc code *sj3-error-alist*)))
1311 (list ':sj3-unknown-error-code code)