On Sat Jul 16, 2005 at 10:24:08AM -0700, GP lisper wrote:
(with-open-stream (rip (ext:process-output (ext:run-program "cdrdao" `("read-test" "-v" "1" "--device"
This needs to be a list, I'm not up enough on backtick tricks to know if it is. Double check in the process list (something similar to "top -c" with a fast rep rate) that the proper arguments appear.
,*burner-scsi-id* ,tocfile) :output :stream :wait nil :error t)))
(when rip (loop for line = (read-line rip nil) while line do (format t "~a~%" line)) (close rip)))
Is ~ what I use daily. I built it up playing in the REPL.
It is a list. The command runs fine, its just filtering its output which is problematic. Here's the only thing I've been able to make work even remotely the way I want it to:
(let ((rip (ext:process-output (ext:run-program "cdrdao" '("read-test" "-v" "1" "--device" "0,6,0" "p7.toc") :output :stream :wait nil :error t)))) (do ((line (read-line rip nil 'done) (read-line rip nil 'done))) ((eql line 'eof)) (let ((progress (scan-to-strings "^Read \d+ of \d+ MB." line))) (if progress (format t "~a~%" progress) (format t "~a~%" (subseq line 0 (1- (length line))))))))
This works - except that there's no graceful exit out of the do loop - it results in the following:
Cdrdao version 1.1.9 - (C) Andreas Mueller andreas@daneb.de
Starting read test... Writing track 01 (mode AUDIO/AUDIO )... Read 0 of 547 MB. Read 36 of 547 MB. Read 104 of 547 MB. Read 264 of 547 MB. Read 341 of 547 MB. Read 418 of 547 MB. Read 244218 blocks.
; Compilation unit aborted.
(After I kill the process in the *slime-repl*):
Type-error in KERNEL::OBJECT-NOT-TYPE-ERROR-HANDLER: DONE is not of type SEQUENCE [Condition of type TYPE-ERROR]
Restarts: 0: [ABORT] Abort SLIME compilation. 1: [ABORT-READ] Abort reading input from Emacs. 2: [ABORT] Abort SLIME compilation. 3: [ABORT] Abort handling SLIME request. 4: [ABORT] Return to Top-Level.
Backtrace: 0: (LENGTH 1 DONE)[:EXTERNAL] 1: (SCAN-TO-STRINGS #<#1=unavailable-arg> #<#1#> :START #<#1#> ...) 2: ("Top-Level Form")[:TOP-LEVEL]
There must be some way to exit that loop gracefully. I tried the loop construct suggested:
(when rip (loop for line = (read-line rip nil) while line do (format t "~a~%" line)) (close rip)))
but couldn't get it to work at all. In any event, why would you need to close rip? Isn't it handled automatically by the 'with-open-stream function?
--Jeff