comparison lisp/process.el @ 406:b8cc9ab3f761 r21-2-33

Import from CVS: tag r21-2-33
author cvs
date Mon, 13 Aug 2007 11:17:09 +0200
parents 74fd4e045ea6
children 501cfd01ee6d
comparison
equal deleted inserted replaced
405:0e08f63c74d2 406:b8cc9ab3f761
1 ;;; process.el --- commands for subprocesses; split out of simple.el 1 ;;; process.el --- commands for subprocesses; split out of simple.el
2 2
3 ;; Copyright (C) 1985-7, 1993,4, 1997 Free Software Foundation, Inc. 3 ;; Copyright (C) 1985-7, 1993,4, 1997 Free Software Foundation, Inc.
4 ;; Copyright (C) 1995 Ben Wing. 4 ;; Copyright (C) 1995, 2000 Ben Wing.
5 5
6 ;; Author: Ben Wing 6 ;; Author: Ben Wing
7 ;; Maintainer: XEmacs Development Team 7 ;; Maintainer: XEmacs Development Team
8 ;; Keywords: internal, processes, dumped 8 ;; Keywords: internal, processes, dumped
9 9
23 ;; along with XEmacs; see the file COPYING. If not, write to the 23 ;; along with XEmacs; see the file COPYING. If not, write to the
24 ;; Free Software Foundation, 59 Temple Place - Suite 330, 24 ;; Free Software Foundation, 59 Temple Place - Suite 330,
25 ;; Boston, MA 02111-1307, USA. 25 ;; Boston, MA 02111-1307, USA.
26 26
27 ;;; Synched up with: FSF 19.30. 27 ;;; Synched up with: FSF 19.30.
28
29 ;;; Authorship:
30
31 ;; Created 1995 by Ben Wing during Mule work -- some commands split out
32 ;; of simple.el and wrappers of *-internal functions created so they could
33 ;; be redefined in a Mule world.
34 ;; Lisp definition of call-process-internal added Mar. 2000 by Ben Wing.
28 35
29 ;;; Commentary: 36 ;;; Commentary:
30 37
31 ;; This file is dumped with XEmacs. 38 ;; This file is dumped with XEmacs.
32 39
64 Wildcards and redirection are handled as usual in the shell." 71 Wildcards and redirection are handled as usual in the shell."
65 ;; We used to use `exec' to replace the shell with the command, 72 ;; We used to use `exec' to replace the shell with the command,
66 ;; but that failed to handle (...) and semicolon, etc. 73 ;; but that failed to handle (...) and semicolon, etc.
67 (start-process name buffer shell-file-name shell-command-switch 74 (start-process name buffer shell-file-name shell-command-switch
68 (mapconcat #'identity args " "))) 75 (mapconcat #'identity args " ")))
76
77 (defun call-process-internal (program &optional infile buffer display &rest args)
78 "Call PROGRAM synchronously in separate process, with coding-system specified.
79 Arguments are
80 (PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS).
81 The program's input comes from file INFILE (nil means `/dev/null').
82 Insert output in BUFFER before point; t means current buffer;
83 nil for BUFFER means discard it; 0 means discard and don't wait.
84 BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
85 REAL-BUFFER says what to do with standard output, as above,
86 while STDERR-FILE says what to do with standard error in the child.
87 STDERR-FILE may be nil (discard standard error output),
88 t (mix it with ordinary output), or a file name string.
89
90 Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.
91 Remaining arguments are strings passed as command arguments to PROGRAM.
92
93 If BUFFER is 0, `call-process' returns immediately with value nil.
94 Otherwise it waits for PROGRAM to terminate and returns a numeric exit status
95 or a signal description string.
96 If you quit, the process is killed with SIGINT, or SIGKILL if you
97 quit again."
98 ;; #### remove windows-nt check when this is ready for prime time.
99 (if (or (noninteractive) (not (eq 'windows-nt system-type)))
100 (apply 'old-call-process-internal program infile buffer display args)
101 (let (proc inbuf errbuf discard)
102 (unwind-protect
103 (progn
104 (when infile
105 (setq infile (expand-file-name infile))
106 (setq inbuf (generate-new-buffer "*call-process*"))
107 (with-current-buffer inbuf
108 (insert-file-contents-internal infile nil nil nil nil
109 coding-system-for-read)))
110 (let ((stderr (if (consp buffer) (second buffer) t)))
111 (if (consp buffer) (setq buffer (car buffer)))
112 (setq buffer
113 (cond ((null buffer) nil)
114 ((eq buffer t) (current-buffer))
115 ;; use integerp for compatibility with existing
116 ;; call-process rmsism.
117 ((integerp buffer) (setq discard t) nil)
118 (t (get-buffer-create buffer))))
119 (when (and stderr (not (eq t stderr)))
120 (setq stderr (expand-file-name stderr))
121 (setq errbuf (generate-new-buffer "*call-process*")))
122 (setq proc
123 (apply 'start-process-internal "*call-process*"
124 buffer
125 ;#### not implemented until my new process
126 ;changes go in.
127 ;(if (eq t stderr) buffer (list buffer errbuf))
128 program args))
129 (if buffer
130 (set-marker (process-mark proc) (point buffer) buffer))
131 (unwind-protect
132 (progn
133 (catch 'call-process-done
134 (when (not discard)
135 (set-process-sentinel
136 proc
137 #'(lambda (proc status)
138 (cond ((eq 'exit (process-status proc))
139 (set-process-sentinel proc nil)
140 (throw 'call-process-done
141 (process-exit-status proc)))
142 ((eq 'signal (process-status proc))
143 (set-process-sentinel proc nil)
144 (throw 'call-process-done status))))))
145 (when inbuf
146 (process-send-region proc 1
147 (1+ (buffer-size inbuf)) inbuf))
148 (process-send-eof proc)
149 (when discard
150 ;; we're trying really really hard to emulate
151 ;; the old call-process.
152 (if errbuf
153 (set-process-sentinel
154 proc
155 `(lambda (proc status)
156 (write-region-internal
157 1 (1+ (buffer-size))
158 ,stderr
159 nil 'major-rms-kludge-city nil
160 coding-system-for-write))))
161 (setq errbuf nil)
162 (setq proc nil)
163 (throw 'call-process-done nil))
164 (while t
165 (accept-process-output proc)
166 (if display (sit-for 0))))
167 (when errbuf
168 (with-current-buffer errbuf
169 (write-region-internal 1 (1+ (buffer-size)) stderr
170 nil 'major-rms-kludge-city nil
171 coding-system-for-write))))
172 (if proc (set-process-sentinel proc nil)))))
173 (if inbuf (kill-buffer inbuf))
174 (if errbuf (kill-buffer errbuf))
175 (condition-case nil
176 (if (and proc (process-live-p proc)) (kill-process proc))
177 (error nil))))))
69 178
70 (defun call-process (program &optional infile buffer displayp &rest args) 179 (defun call-process (program &optional infile buffer displayp &rest args)
71 "Call PROGRAM synchronously in separate process. 180 "Call PROGRAM synchronously in separate process.
72 The program's input comes from file INFILE (nil means `/dev/null'). 181 The program's input comes from file INFILE (nil means `/dev/null').
73 Insert output in BUFFER before point; t means current buffer; 182 Insert output in BUFFER before point; t means current buffer;