;;; -*- Mode:LISP; Package:K-KBUG; Readtable:CL; Base:10 -*- ;;; This is a wimpy terminal connection to the K (defmacro without-more-processing (the-window &body body) "execute body with more processing disabled" (let ((more-p (gentemp "morep")) (window (gentemp "window"))) `(let* ((,window ,the-window) (,more-p (si::send ,window :more-p))) (unwind-protect (progn (si::send ,window :set-more-p nil) ,@body) (si::send ,window ':set-more-p ,more-p))))) (defun wimp (&optional half-duplex) "communicate with the K stream" (without-more-processing *terminal-io* (si::*catch 'eof (let (p) (unwind-protect (progn (setq p (si::process-run-function "wimp input from K" #'wimp-tty-characters-from-k *terminal-io* si::current-process)) (cond (half-duplex (do ((line)) (nil) (setq line (si::prompt-and-read :string "")) (do ((j 0 (1+ j)) (n (length line))) ((= j n)) (wimp-send-1-to-k (aref line j))) (wimp-send-1-to-k #\return))) ('else (si::do-forever (wimp-send-1-to-k (read-char *terminal-io*)))))) (and p (si::send p :kill))))))) (defun wimp-tty-characters-from-k (to superior) (si::condition-case (x) (do ((c)) ((null (setq c (kbug:read-from-k-stream))) (format to "~&***CONNECTION CLOSED AT REMOTE END***~%")) (write-char c to)) (si::error (si::send x :report to))) (si::send superior :interrupt #'(lambda () (si::*throw 'eof nil))) (si:process-wait-forever)) (defun wimp-send-1-to-k (char) (write-to-k-character-stream char))