/* Synchronous subprocess invocation for GNU Emacs.
Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, 1999, 2000, 2001,
- 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
#include <config.h>
Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.
Remaining arguments are strings passed as command arguments to PROGRAM.
+If executable PROGRAM can't be found as an executable, `call-process'
+signals a Lisp error. `call-process' reports errors in execution of
+the program only through its return and output.
+
If BUFFER is 0, `call-process' returns immediately with value nil.
Otherwise it waits for PROGRAM to terminate
and returns a numeric exit status or a signal description string.
if (nargs >= 5)
{
int must_encode = 0;
+ Lisp_Object coding_attrs;
for (i = 4; i < nargs; i++)
CHECK_STRING (args[i]);
else
val = Qnil;
}
+ val = coding_inherit_eol_type (val, Qnil);
setup_coding_system (Fcheck_coding_system (val), &argument_coding);
+ coding_attrs = CODING_ID_ATTRS (argument_coding.id);
+ if (NILP (CODING_ATTR_ASCII_COMPAT (coding_attrs)))
+ {
+ /* We should not use an ASCII incompatible coding system. */
+ val = raw_text_coding_system (val);
+ setup_coding_system (val, &argument_coding);
+ }
}
}
protected by the caller, so all we really have to worry about is
buffer. */
{
- struct gcpro gcpro1, gcpro2, gcpro3;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
current_dir = current_buffer->directory;
- GCPRO3 (infile, buffer, current_dir);
+ GCPRO4 (infile, buffer, current_dir, error_file);
current_dir
= expand_and_dir_to_file (Funhandled_file_name_directory (current_dir),
report_file_error ("Setting current directory",
Fcons (current_buffer->directory, Qnil));
+ if (STRING_MULTIBYTE (infile))
+ infile = ENCODE_FILE (infile);
+ if (STRING_MULTIBYTE (current_dir))
+ current_dir = ENCODE_FILE (current_dir);
+ if (STRINGP (error_file) && STRING_MULTIBYTE (error_file))
+ error_file = ENCODE_FILE (error_file);
UNGCPRO;
}
filefd = emacs_open (SDATA (infile), O_RDONLY, 0);
if (filefd < 0)
{
+ infile = DECODE_FILE (infile);
report_file_error ("Opening process input file", Fcons (infile, Qnil));
}
/* Search for program; barf if not found. */
#ifdef MSDOS
unlink (tempfile);
#endif
- report_file_error ("Cannot redirect stderr",
- Fcons ((NILP (error_file)
- ? build_string (NULL_DEVICE) : error_file),
- Qnil));
+ if (NILP (error_file))
+ error_file = build_string (NULL_DEVICE);
+ else if (STRINGP (error_file))
+ error_file = DECODE_FILE (error_file);
+ report_file_error ("Cannot redirect stderr", Fcons (error_file, Qnil));
}
- current_dir = ENCODE_FILE (current_dir);
-
#ifdef MAC_OS8
{
/* Call run_mac_command in sysdep.c here directly instead of doing
delete_temp_file (name)
Lisp_Object name;
{
- /* Use Fdelete_file (indirectly) because that runs a file name handler.
- We did that when writing the file, so we should do so when deleting. */
+ /* Suppress jka-compr handling, etc. */
+ int count = SPECPDL_INDEX ();
+ specbind (intern ("file-name-handler-alist"), Qnil);
internal_delete_file (name);
+ unbind_to (count, Qnil);
return Qnil;
}
int count1 = SPECPDL_INDEX ();
specbind (intern ("coding-system-for-write"), val);
+ /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
+ happen to get a ".Z" suffix. */
+ specbind (intern ("file-name-handler-alist"), Qnil);
Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil);
unbind_to (count1, Qnil);