Added SET-CURRENT-INPUT-PORT! and friends.

Rehacked stdio/stdport sync procedures.
This commit is contained in:
shivers 1995-10-28 22:12:17 +00:00
parent 28ab57259a
commit 737ebc5afe
6 changed files with 45 additions and 91 deletions

View File

@ -367,6 +367,15 @@
(with-error-output-port* port (lambda () body ...))) (with-error-output-port* port (lambda () body ...)))
;;; set-foo-port! procs
;;; -------------------
;;; Side-effecting variants of with-current-input-port* and friends.
(define (set-current-input-port! port) (set-fluid! $current-input-port port))
(define (set-current-output-port! port) (set-fluid! $current-output-port port))
(define (set-error-output-port! port) (set-fluid! $error-output-port port))
;;; call-with-foo-file with-foo-to-file ;;; call-with-foo-file with-foo-to-file
;;; ----------------------------------- ;;; -----------------------------------

View File

@ -26,9 +26,7 @@
(dup->outport tty 1) (dup->outport tty 1)
(set-port-buffering (dup->outport tty 2) (set-port-buffering (dup->outport tty 2)
bufpol/none)) bufpol/none))
(with-stdio-ports* thunk))))
;; No good -- leaves old ones around:
(stdio->stdports thunk))))
(pty-out (dup->outport pty-in))) (pty-out (dup->outport pty-in)))
(set-port-buffering pty-out bufpol/none) (set-port-buffering pty-out bufpol/none)

View File

@ -175,6 +175,15 @@
(with-current-output-port :syntax) (with-current-output-port :syntax)
with-error-output-port* with-error-output-port*
(with-error-output-port :syntax) (with-error-output-port :syntax)
set-current-input-port!
set-current-output-port!
set-error-output-port!
stdports->stdio
stdio->stdports
with-stdio-ports*
(with-stdio-ports :syntax)
call/fdes call/fdes
release-port-handle release-port-handle
port-revealed port-revealed
@ -189,8 +198,6 @@
port->list port->list
reduce-port reduce-port
port->fdes port->fdes
stdports->stdio
stdio->stdports
read-string read-string
read-string! read-string!
read-string/partial read-string/partial
@ -248,10 +255,12 @@
file-socket? file-socket?
file-special? file-special?
file-not-readable? file-not-readable?
file-not-writeable? file-not-writable?
file-not-writeable? ; Deprecated
file-not-executable? file-not-executable?
file-readable? file-readable?
file-writeable? file-writeable?
file-writable? ; Deprecated
file-executable? file-executable?
file-not-exists? file-not-exists?
file-exists? file-exists?
@ -497,7 +506,6 @@
(run/string :syntax) (run/string :syntax)
(run/sexp :syntax) (run/sexp :syntax)
(run/sexps :syntax) (run/sexps :syntax)
(run/pty :syntax)
fork/pipe fork/pipe
%fork/pipe %fork/pipe
@ -508,7 +516,6 @@
run/collecting* run/collecting*
run/port+proc* run/port+proc*
run/port* run/port*
run/pty*
run/file* run/file*
run/string* run/string*
run/sexp* run/sexp*
@ -539,7 +546,8 @@
optional-arg optional-arg* parse-optionals optional-arg optional-arg* parse-optionals
check-arg conjoin disjoin negate compose reverse! call/cc check-arg conjoin disjoin negate compose reverse! call/cc
deprecated-proc deprecated-proc
deposit-bit-field)) deposit-bit-field
real->exact-integer))
;;; semi-standard network magic numbers ;;; semi-standard network magic numbers
;;; should be available on all platforms ;;; should be available on all platforms

View File

@ -472,79 +472,6 @@
(define (run/strings* thunk) (define (run/strings* thunk)
(close-after (run/port* thunk) port->string-list)) (close-after (run/port* thunk) port->string-list))
;;; Pseudo terminals
(define (run/pty* thunk)
(receive (pty tty)
(pty-open)
(let ((proc (fork (lambda ()
(dup->inport tty 0)
(dup->outport tty 1)
(dup->outport tty 2)
(close tty)
(thunk)))))
(values proc pty (dup->outport pty)))))
;; returns an open pty and the name of the corresponding tty
(define (pty-open)
(let ((next-pty (make-pty-generator)))
(let loop ()
(cond ((next-pty) =>
(lambda (pty-name)
;; what if we have an error opening tty?
;; supposedly it's agreed to open pty first
;; but what does the average unix programer know
;; unix standards. if it works once, it's fine -bri
(with-errno-handler ((errno packet)
((errno/io errno/acces)
(loop)))
(let ((pty (open-file pty-name open/read+write)))
(values pty
(open-file (pty->tty pty-name)
open/read+write))))))
(else
(error "pty-open: could not open new pty"))))))
;; The following code two pty functions may in fact be system dependant
;; if so, we'll move it out to the architecture specific directories
;; i can't believe this isnt standard or at least a library routine.
;; oh wait, sysV has libpt.a with routines like this but they are
;; undocumented. welcome to the future -bri
;;; takes a pty string and makes a new string that is the matching tty
(define (pty->tty pty)
(let ((p-pos 5) ; index of p in pty
(tty (string-copy pty)))
(string-set! tty p-pos #\t)
tty))
;;; a generator for all possible pty names
(define (make-pty-generator)
(let* ((pattern (string-copy"/dev/ptyLN")) ; L=letter N=number
(len (string-length pattern))
(l-pos (- len 2))
(n-pos (- len 1))
;; from telnetd source in BSD4.4
(letters "pqrstuvwxyzPQRST")
(numbers "0123456789abcdef")
(l-len (string-length letters))
(n-len (string-length numbers))
(l 0)
(n 0))
(string-set! pattern l-pos (string-ref letters l)) ; initialize letter
(lambda ()
(cond ((= n n-len)
(set! l (+ l 1))
(cond ((>= l l-len) #f)
(else
(string-set! pattern l-pos (string-ref letters l))
(string-set! pattern n-pos (string-ref numbers 0))
(set! n 1)
pattern)))
(else
(string-set! pattern n-pos (string-ref numbers n)) ; change number
(set! n (+ n 1))
pattern)))))
;;; Read characters from PORT until EOF, collect into a string. ;;; Read characters from PORT until EOF, collect into a string.
@ -621,12 +548,24 @@
(substring buf 0 nread)))) ; last one. (substring buf 0 nread)))) ; last one.
(lp)))))))) (lp))))))))
(define (stdio->stdports thunk)
;;; Stdio/stdport sync procedures
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (stdio->stdports)
(set-current-input-port! (fdes->inport 0))
(set-current-output-port! (fdes->inport 1))
(set-error-output-port! (fdes->inport 2)))
(define (with-stdio-ports* thunk)
(with-current-input-port (fdes->inport 0) (with-current-input-port (fdes->inport 0)
(with-current-output-port (fdes->outport 1) (with-current-output-port (fdes->outport 1)
(with-error-output-port (fdes->outport 2) (with-error-output-port (fdes->outport 2)
(thunk))))) (thunk)))))
(define-simple-syntax (with-stdio-ports body ...)
(with-stdio-ports* (lambda () body ...)))
(define (stdports->stdio) (define (stdports->stdio)
(dup (current-input-port) 0) (dup (current-input-port) 0)

View File

@ -100,9 +100,9 @@
(define (transcribe-begin-process-form body rename compare) (define (transcribe-begin-process-form body rename compare)
(let ((%stdio->stdports (rename 'stdio->stdports)) (let ((%with-stdio-ports* (rename 'with-stdio-ports*))
(%lambda (rename 'lambda))) (%lambda (rename 'lambda)))
`(,%stdio->stdports (,%lambda () . ,body)))) `(,%with-stdio-ports* (,%lambda () . ,body))))
(define (transcribe-simple-pipeline pfs rename compare) (define (transcribe-simple-pipeline pfs rename compare)

View File

@ -401,11 +401,11 @@
(define (set-file-times/errno path . maybe-times) (define (set-file-times/errno path . maybe-times)
(if (pair? maybe-times) (if (pair? maybe-times)
(let ((access-time (car maybe-times)) (let* ((access-time (real->exact-integer (car maybe-times)))
(mod-time (if (pair? (cddr maybe-times)) (mod-time (if (pair? (cddr maybe-times))
(error "Too many arguments to set-file-times/errno" (error "Too many arguments to set-file-times/errno"
(cons path maybe-times)) (cons path maybe-times))
(cadr maybe-times)))) (real->exact-integer (cadr maybe-times)))))
(%utime/errno path (hi8 access-time) (lo24 access-time) (%utime/errno path (hi8 access-time) (lo24 access-time)
(hi8 mod-time) (lo24 mod-time))) (hi8 mod-time) (lo24 mod-time)))
(%utime-now/errno path))) (%utime-now/errno path)))