From: Richard M K. <kr...@pr...> - 2006-12-24 05:41:02
|
"Chun Tian (binghe)" <bin...@gm...> writes: > As we all known, sbcl's run-program function can return a output stream > which contains running process' output data, by using :output :stream > and process-output. I think by default this stream's encoding format is > UTF-8 (I do a test to find this), but I wan't use another > external-format, is it possible? How? I believe the patch below adds the desired feature for the cases when :input, :output, or :error are :stream. (Dealing with the cases where any of these is a stream is trickier, but this is a start.) -- RmK --- run-program.lisp.~1.63.~ 2006-11-15 11:35:17.000000000 -0500 +++ run-program.lisp 2006-12-24 00:38:20.000000000 -0500 @@ -615,10 +615,13 @@ pty input if-input-does-not-exist + (input-external-format :default) output (if-output-exists :error) + (output-external-format :default) (error :output) (if-error-exists :error) + (error-external-format :default) status-hook) #+sb-doc "RUN-PROGRAM creates a new Unix process running the Unix program @@ -676,6 +679,8 @@ :ERROR to generate an error :CREATE to create an empty file NIL (the default) to return NIL from RUN-PROGRAM + :INPUT-EXTERNAL-FORMAT (when :INPUT is :STREAM) + Program input will be encoded in this format. :OUTPUT Either T, NIL, a pathname, a stream, or :STREAM. If T, the standard output for the current process is inherited. If NIL, /dev/null @@ -689,10 +694,14 @@ :SUPERSEDE to supersede the file with output from the program :APPEND to append output from the program to the file NIL to return NIL from RUN-PROGRAM, without doing anything + :OUTPUT-EXTERNAL-FORMAT (when :OUTPUT is :STREAM) + Program output will be decoded from this format. :ERROR and :IF-ERROR-EXISTS Same as :OUTPUT and :IF-OUTPUT-EXISTS, except that :ERROR can also be specified as :OUTPUT in which case all error output is routed to the same place as normal output. + :ERROR-EXTERNAL-FORMAT (when :ERROR is :STREAM) + Program error output will be decoded from this format. :STATUS-HOOK This is a function the system calls whenever the status of the process changes. The function takes the process as an argument." @@ -725,17 +734,21 @@ (multiple-value-bind (stdin input-stream) (get-descriptor-for input cookie :direction :input - :if-does-not-exist if-input-does-not-exist) + :if-does-not-exist if-input-does-not-exist + :external-format input-external-format) (multiple-value-bind (stdout output-stream) (get-descriptor-for output cookie :direction :output - :if-exists if-output-exists) + :if-exists if-output-exists + :external-format output-external-format) (multiple-value-bind (stderr error-stream) (if (eq error :output) (values stdout output-stream) (get-descriptor-for error cookie :direction :output - :if-exists if-error-exists)) + :if-exists if-error-exists + :external-format + error-external-format)) (multiple-value-bind (pty-name pty-stream) (open-pty pty cookie) ;; Make sure we are not notified about the child @@ -778,10 +791,13 @@ search input if-input-does-not-exist + (input-external-format :default) output (if-output-exists :error) + (output-external-format :default) (error :output) (if-error-exists :error) + (error-external-format :default) status-hook) "RUN-PROGRAM creates a new process specified by the PROGRAM argument. ARGS are the standard arguments that can be passed to a @@ -811,6 +827,8 @@ :ERROR to generate an error :CREATE to create an empty file NIL (the default) to return NIL from RUN-PROGRAM + :INPUT-EXTERNAL-FORMAT (when :INPUT is :STREAM) + Program input will be encoded in this format. :OUTPUT Either T, NIL, a pathname, a stream, or :STREAM. If T, the standard output for the current process is inherited. If NIL, nul @@ -824,10 +842,14 @@ :SUPERSEDE to supersede the file with output from the program :APPEND to append output from the program to the file NIL to return NIL from RUN-PROGRAM, without doing anything + :OUTPUT-EXTERNAL-FORMAT (when :OUTPUT is :STREAM) + Program output will be decoded from this format. :ERROR and :IF-ERROR-EXISTS Same as :OUTPUT and :IF-OUTPUT-EXISTS, except that :ERROR can also be specified as :OUTPUT in which case all error output is routed to the same place as normal output. + :ERROR-EXTERNAL-FORMAT (when :ERROR is :STREAM) + Program error output will be decoded from this format. :STATUS-HOOK This is a function the system calls whenever the status of the process changes. The function takes the process as an argument." @@ -865,17 +887,21 @@ (multiple-value-bind (stdin input-stream) (get-descriptor-for input cookie :direction :input - :if-does-not-exist if-input-does-not-exist) + :if-does-not-exist if-input-does-not-exist + :external-format input-external-format) (multiple-value-bind (stdout output-stream) (get-descriptor-for output cookie :direction :output - :if-exists if-output-exists) + :if-exists if-output-exists + :external-format output-external-format) (multiple-value-bind (stderr error-stream) (if (eq error :output) (values stdout output-stream) (get-descriptor-for error cookie :direction :output - :if-exists if-error-exists)) + :if-exists if-error-exists + :external-format + error-external-format)) (with-c-strvec (args-vec simple-args) (let ((handle (without-gcing (spawn pfile args-vec @@ -987,7 +1013,7 @@ (defun get-descriptor-for (object cookie &rest keys - &key direction + &key direction external-format &allow-other-keys) (cond ((eq object t) ;; No new descriptor is needed. @@ -1018,13 +1044,17 @@ (push read-fd *close-in-parent*) (push write-fd *close-on-error*) (let ((stream (sb-sys:make-fd-stream write-fd :output t - :element-type :default))) + :element-type :default + :external-format + external-format))) (values read-fd stream))) (:output (push read-fd *close-on-error*) (push write-fd *close-in-parent*) (let ((stream (sb-sys:make-fd-stream read-fd :input t - :element-type :default))) + :element-type :default + :external-format + external-format))) (values write-fd stream))) (t (sb-unix:unix-close read-fd) |