home *** CD-ROM | disk | FTP | other *** search
- ;;; (C) Copyright 1984 by Gold Hill Computers
-
- ;;; The DRIBBLE facility (slurp)
- ;;; The only toplevel function in this file is DRIBBLE.
-
- (DEFVAR *DRIBBLE-STREAM* NIL) ; the DRIBBLE output stream
- (DEFVAR *DRIBBLE-TERMINAL* NIL) ; during DRIBBLE this is terminal
-
- (DEFUN DRIBBLE (&OPTIONAL PN)
- "DRIBBLE with a pathname argument start the dribble operation, with
- no pathname argument ends the dribble operation."
- (COND ((AND PN (NULL *DRIBBLE-STREAM*)) ; open dribble file
- (SETQ *DRIBBLE-STREAM* (OPEN PN :DIRECTION :OUTPUT)
- *DRIBBLE-UNREAD-CHAR* NIL
- *DRIBBLE-TERMINAL* *TERMINAL-IO*
- *TERMINAL-IO* #'DRIBBLE-TERM)
- T)
- ((AND (NULL PN) *DRIBBLE-STREAM*) ; close dribble file
- (SETQ *TERMINAL-IO* *DRIBBLE-TERMINAL*)
- (CLOSE *DRIBBLE-STREAM*)
- (SETQ *DRIBBLE-STREAM* NIL))
- ((AND (NULL PN) (NULL *DRIBBLE-STREAM*)) ; asked to close but not open
- (FORMAT T "~&DRIBBLE not in progress."))
- ((AND PN *DRIBBLE-STREAM*) ; asked to open but already open
- (FORMAT T "~&DRIBBLE is already in progress."))
- ))
-
- (DEFVAR *DRIBBLE-UNREAD-CHAR* NIL)
-
- ;; This is the input stream handler during a dribble.
- (DEFUN DRIBBLE-IN (MSG &REST ARGS)
- (CASE MSG
- (:READ-CHAR
- (COND (*DRIBBLE-UNREAD-CHAR*
- (PROG1 *DRIBBLE-UNREAD-CHAR*
- (SETQ *DRIBBLE-UNREAD-CHAR* NIL)))
- (T
- (LET ((CHAR (SEND *DRIBBLE-TERMINAL* :READ-CHAR)))
- (SEND *DRIBBLE-STREAM* :WRITE-CHAR CHAR)
- CHAR))))
- (:UNREAD-CHAR (SETQ *DRIBBLE-UNREAD-CHAR* (CAR ARGS)))
- ;; forward to the real stream.
- (OTHERWISE
- (APPLY *DRIBBLE-TERMINAL* MSG ARGS))))
-
- ;; This is the output stream handler during a dribble.
- (DEFUN DRIBBLE-OUT (&REST ARGS)
- (APPLY *DRIBBLE-STREAM* ARGS)
- (APPLY *DRIBBLE-TERMINAL* ARGS))
-
- ;; This is the stream for *TERMINAL-IO* during a dribble.
- ;; Depending on the message we decide to dispatch to the input
- ;; or output dribble streams.
- (DEFUN DRIBBLE-TERM (&REST ARGS)
- (CASE (CAR ARGS)
- ((:WRITE-CHAR :WRITE-STRING :WRITE-LINE) (APPLY #'DRIBBLE-OUT ARGS))
- (OTHERWISE (APPLY #'DRIBBLE-IN ARGS))))
-