;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
-;; Obtain movements and other information from a subprocess
+;; Obtain movements and other information from an engine
;;
;; $Revision$
(require 'chess-game)
(defgroup chess-engine nil
- "Code for reading movements and other commands from a subprocess."
+ "Code for reading movements and other commands from an engine."
:group 'chess)
(defvar chess-engine-regexp-alist nil)
(defvar chess-engine-event-handler nil)
(defvar chess-engine-response-handler nil)
+(defvar chess-engine-internal-object nil)
+(defvar chess-engine-current-marker nil)
(defvar chess-engine-position nil)
(defvar chess-engine-game nil)
(make-variable-buffer-local 'chess-engine-regexp-alist)
(make-variable-buffer-local 'chess-engine-event-handler)
(make-variable-buffer-local 'chess-engine-response-handler)
+(make-variable-buffer-local 'chess-engine-internal-object)
+(make-variable-buffer-local 'chess-engine-current-marker)
(make-variable-buffer-local 'chess-engine-position)
(make-variable-buffer-local 'chess-engine-game)
chess-engine-event-handler handler
chess-engine-response-handler (or 'chess-engine-default-handler
user-handler))
- (let ((proc (funcall handler 'initialize)))
- (unless (and proc (memq (process-status proc) '(run open)))
- (error "Failed to start chess engine process"))
- (set-process-buffer proc (current-buffer))
- (set-process-filter proc 'chess-engine-filter)
- (set-marker (process-mark proc) (point)))
+ (let ((object (funcall handler 'initialize)))
+ (when (processp object)
+ (unless (memq (process-status object) '(run open))
+ (error "Failed to start chess engine process"))
+ (set-process-buffer object (current-buffer))
+ (set-process-filter object 'chess-engine-filter))
+ (setq chess-engine-current-marker (point-marker)
+ chess-engine-internal-object object))
(current-buffer))))
(defun chess-engine-destroy (engine)
(chess-engine-command engine 'pass)))
(defun chess-engine-send (engine string)
+ "Send the given STRING to ENGINE."
(chess-with-current-buffer engine
- (let ((proc (get-buffer-process (current-buffer))))
- (if (and proc (memq (process-status proc) '(run open)))
- (process-send-string proc string)
- (error "The engine you were using is no longer running")))))
+ (let ((object chess-engine-internal-object))
+ (if (and (processp object))
+ (if (memq (process-status object) '(run open))
+ (process-send-string object string)
+ (error "The engine you were using is no longer running"))
+ (chess-engine-command nil 'send string)))))
+
+(defun chess-engine-submit (engine string)
+ "Submit the given STRING, so ENGINE sees it in its input stream."
+ (chess-with-current-buffer engine
+ (let ((object chess-engine-internal-object))
+ (if (and (processp object)
+ (not (memq (process-status object) '(run open))))
+ (error "The engine you were using is no longer running"))
+ (chess-engine-filter object string))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
((eq event 'pass)
(chess-engine-pass engine)))))
-(defun chess-engine-filter (proc string)
- "Process filter for receiving text from a chess process."
- (let ((buf (process-buffer proc)))
+(defun chess-engine-filter (object string)
+ "Filter for receiving text for an engine from an outside source."
+ (let ((buf (if (processp object)
+ (process-buffer object)
+ (current-buffer))))
(when (buffer-live-p buf)
(with-current-buffer buf
- (let ((moving (= (point) (process-mark proc))))
+ (let ((moving (= (point) chess-engine-current-marker)))
(save-excursion
- ;; Insert the text, advancing the process marker.
- (goto-char (process-mark proc))
+ ;; Insert the text, advancing the marker.
+ (goto-char chess-engine-current-marker)
(insert string)
- (set-marker (process-mark proc) (point)))
- (if moving (goto-char (process-mark proc))))
+ (set-marker chess-engine-current-marker (point)))
+ (if moving (goto-char chess-engine-current-marker)))
(unless chess-engine-working
(setq chess-engine-working t)
(unwind-protect