ist (reverse defs) `(expect ,@(reverse body)))) (else (let ((rxname (gensym))) (next-test (cdr tests) (cdr exprs) (cons `(,rxname (make-regexp ,(car tests) expect-strings-compile-flags)) defs) (cons `((lambda (s eof?) (expect-regexec ,rxname s eof?)) ,@(car exprs)) body)))))))) ;;; simplified select: returns #t if input is waiting or #f if timed out or ;;; select was interrupted by a signal. ;;; timeout is an absolute time in floating point seconds. (define (expect-select port timeout) (let* ((secs-usecs (gettimeofday)) (relative (- timeout (car secs-usecs) (/ (cdr secs-usecs) 1000000)))) ; one million. (and (> relative 0) (pair? (car (select (list port) '() '() relative)))))) ;;; match a string against a regexp, returning a list of strings (required ;;; by the => syntax) or #f. called once each time a character is added ;;; to s (eof? will be #f), and once when eof is reached (with eof? #t). (define (expect-regexec rx s eof?) ;; if expect-strings-exec-flags contains regexp/noteol, ;; remove it for the eof test. (let* ((flags (if (and eof? (logand expect-strings-exec-flags regexp/noteol)) (logxor expect-strings-exec-flags regexp/noteol) expect-strings-exec-flags)) (match (regexp-exec rx s 0 flags))) (if match (do ((i (- (match:count match) 1) (- i 1)) (result '() (cons (match:substring match i) result))) ((< i 0) result)) #f))) ;;; expect.scm ends here