(barf_or_query_if_file_exists): Make the "File is a directory"
[bpt/emacs.git] / src / fileio.c
CommitLineData
570d7624 1/* File IO for GNU Emacs.
e9bffc61 2
73b0cd50 3Copyright (C) 1985-1988, 1993-2011 Free Software Foundation, Inc.
570d7624
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
570d7624 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
570d7624
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
570d7624 19
18160b98 20#include <config.h>
77a28bbf 21#include <limits.h>
bb369dc6 22#include <fcntl.h>
1b335d29 23#include <stdio.h>
570d7624
JB
24#include <sys/types.h>
25#include <sys/stat.h>
d7306fe6 26#include <setjmp.h>
29beb080 27#include <unistd.h>
29beb080 28
5b9c0a1d 29#ifdef HAVE_PWD_H
570d7624 30#include <pwd.h>
bfb61299
JB
31#endif
32
570d7624 33#include <ctype.h>
570d7624
JB
34#include <errno.h>
35
574c05e2
KK
36#ifdef HAVE_LIBSELINUX
37#include <selinux/selinux.h>
38#include <selinux/context.h>
39#endif
40
570d7624 41#include "lisp.h"
8d4e077b 42#include "intervals.h"
570d7624 43#include "buffer.h"
db327c7e 44#include "character.h"
6fdaa9a0 45#include "coding.h"
570d7624 46#include "window.h"
67c08d6c 47#include "blockinput.h"
385ed61f
KL
48#include "frame.h"
49#include "dispextern.h"
570d7624 50
5e570b75
RS
51#ifdef WINDOWSNT
52#define NOMINMAX 1
53#include <windows.h>
5e570b75
RS
54#include <fcntl.h>
55#endif /* not WINDOWSNT */
56
7990d02a
EZ
57#ifdef MSDOS
58#include "msdos.h"
59#include <sys/param.h>
7990d02a 60#include <fcntl.h>
7990d02a 61#endif
7990d02a 62
199607e4 63#ifdef DOS_NT
199607e4
RS
64/* On Windows, drive letters must be alphabetic - on DOS, the Netware
65 redirector allows the six letters between 'Z' and 'a' as well. */
66#ifdef MSDOS
67#define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
68#endif
69#ifdef WINDOWSNT
5976c3fe 70#define IS_DRIVE(x) isalpha ((unsigned char) (x))
199607e4 71#endif
f54b565c
MB
72/* Need to lower-case the drive letter, or else expanded
73 filenames will sometimes compare inequal, because
74 `expand-file-name' doesn't always down-case the drive letter. */
5976c3fe 75#define DRIVE_LETTER(x) (tolower ((unsigned char) (x)))
199607e4
RS
76#endif
77
de5bf5d3 78#include "systime.h"
570d7624
JB
79
80#ifdef HPUX
81#include <netio.h>
47e7b9e5 82#endif
570d7624 83
9c856db9 84#include "commands.h"
9c856db9 85
c1558952
TTN
86#ifndef FILE_SYSTEM_CASE
87#define FILE_SYSTEM_CASE(filename) (filename)
88#endif
89
570d7624 90/* Nonzero during writing of auto-save files */
5045092b 91static int auto_saving;
570d7624
JB
92
93/* Set by auto_save_1 to mode of original file so Fwrite_region will create
94 a new file with the same mode as the original */
5045092b 95static int auto_save_mode_bits;
570d7624 96
ca730bf0 97/* Set by auto_save_1 if an error occurred during the last auto-save. */
5045092b 98static int auto_save_error_occurred;
ca730bf0 99
356a6224
KH
100/* The symbol bound to coding-system-for-read when
101 insert-file-contents is called for recovering a file. This is not
102 an actual coding system name, but just an indicator to tell
103 insert-file-contents to use `emacs-mule' with a special flag for
104 auto saving and recovering a file. */
955cbe7b 105static Lisp_Object Qauto_save_coding;
356a6224 106
f6c9b683
RS
107/* Property name of a file name handler,
108 which gives a list of operations it handles.. */
955cbe7b 109static Lisp_Object Qoperations;
f6c9b683 110
0d420e88 111/* Lisp functions for translating file formats */
955cbe7b 112static Lisp_Object Qformat_decode, Qformat_annotate_function;
0d420e88 113
2080470e 114/* Lisp function for setting buffer-file-coding-system and the
b6426b03 115 multibyteness of the current buffer after inserting a file. */
955cbe7b 116static Lisp_Object Qafter_insert_file_set_coding;
b6426b03 117
955cbe7b 118static Lisp_Object Qwrite_region_annotate_functions;
67fbc0cb
CY
119/* Each time an annotation function changes the buffer, the new buffer
120 is added here. */
5045092b 121static Lisp_Object Vwrite_region_annotation_buffers;
67fbc0cb 122
ccf61795 123#ifdef HAVE_FSYNC
ccf61795
RF
124#endif
125
955cbe7b 126static Lisp_Object Qdelete_by_moving_to_trash;
d2b66acf 127
6cf29fe8 128/* Lisp function for moving files to trash. */
955cbe7b 129static Lisp_Object Qmove_file_to_trash;
6cf29fe8 130
8719abec 131/* Lisp function for recursively copying directories. */
955cbe7b 132static Lisp_Object Qcopy_directory;
8719abec
CY
133
134/* Lisp function for recursively deleting directories. */
955cbe7b 135static Lisp_Object Qdelete_directory;
8719abec 136
c1c4693e 137#ifdef WINDOWSNT
c1c4693e
RS
138#endif
139
955cbe7b
PE
140Lisp_Object Qfile_error;
141static Lisp_Object Qfile_already_exists, Qfile_date_error;
142static Lisp_Object Qexcl;
15c65264
RS
143Lisp_Object Qfile_name_history;
144
955cbe7b 145static Lisp_Object Qcar_less_than_car;
d6a3cc15 146
cd64ea1d 147static Lisp_Object Fmake_symbolic_link (Lisp_Object, Lisp_Object, Lisp_Object);
8a2cbd72 148static int a_write (int, Lisp_Object, EMACS_INT, EMACS_INT,
f57e2426 149 Lisp_Object *, struct coding_system *);
8bd7b830 150static int e_write (int, Lisp_Object, EMACS_INT, EMACS_INT,
8a2cbd72 151 struct coding_system *);
ce51c54c 152
ec7adf26 153\f
5d01d666 154void
971de7fb 155report_file_error (const char *string, Lisp_Object data)
570d7624
JB
156{
157 Lisp_Object errstring;
505ab9bc 158 int errorno = errno;
d7259fdb 159 char *str;
570d7624 160
ca9c0567 161 synchronize_system_messages_locale ();
d7259fdb
KH
162 str = strerror (errorno);
163 errstring = code_convert_string_norecord (make_unibyte_string (str,
164 strlen (str)),
68c45bf0
PE
165 Vlocale_coding_system, 0);
166
570d7624 167 while (1)
505ab9bc
RS
168 switch (errorno)
169 {
170 case EEXIST:
24b1ddad 171 xsignal (Qfile_already_exists, Fcons (errstring, data));
505ab9bc
RS
172 break;
173 default:
174 /* System error messages are capitalized. Downcase the initial
39824137
EZ
175 unless it is followed by a slash. (The slash case caters to
176 error messages that begin with "I/O" or, in German, "E/A".) */
d5443ffd
KH
177 if (STRING_MULTIBYTE (errstring)
178 && ! EQ (Faref (errstring, make_number (1)), make_number ('/')))
6c0969ca
KH
179 {
180 int c;
181
51b59d79 182 str = SSDATA (errstring);
5976c3fe 183 c = STRING_CHAR ((unsigned char *) str);
5da9919f 184 Faset (errstring, make_number (0), make_number (downcase (c)));
6c0969ca 185 }
505ab9bc 186
24b1ddad 187 xsignal (Qfile_error,
505ab9bc
RS
188 Fcons (build_string (string), Fcons (errstring, data)));
189 }
570d7624 190}
b5148e85 191
b27a1703 192Lisp_Object
971de7fb 193close_file_unwind (Lisp_Object fd)
b5148e85 194{
68c45bf0 195 emacs_close (XFASTINT (fd));
b27a1703 196 return Qnil;
b5148e85 197}
a1d2b64a
RS
198
199/* Restore point, having saved it as a marker. */
200
5dcde606 201Lisp_Object
971de7fb 202restore_point_unwind (Lisp_Object location)
a1d2b64a 203{
ec7adf26 204 Fgoto_char (location);
a1d2b64a 205 Fset_marker (location, Qnil, Qnil);
b27a1703 206 return Qnil;
a1d2b64a 207}
59c94f03 208
570d7624 209\f
955cbe7b
PE
210static Lisp_Object Qexpand_file_name;
211static Lisp_Object Qsubstitute_in_file_name;
212static Lisp_Object Qdirectory_file_name;
213static Lisp_Object Qfile_name_directory;
214static Lisp_Object Qfile_name_nondirectory;
215static Lisp_Object Qunhandled_file_name_directory;
216static Lisp_Object Qfile_name_as_directory;
217static Lisp_Object Qcopy_file;
218static Lisp_Object Qmake_directory_internal;
219static Lisp_Object Qmake_directory;
220static Lisp_Object Qdelete_directory_internal;
32f4334d 221Lisp_Object Qdelete_file;
955cbe7b
PE
222static Lisp_Object Qrename_file;
223static Lisp_Object Qadd_name_to_file;
224static Lisp_Object Qmake_symbolic_link;
32f4334d 225Lisp_Object Qfile_exists_p;
955cbe7b
PE
226static Lisp_Object Qfile_executable_p;
227static Lisp_Object Qfile_readable_p;
228static Lisp_Object Qfile_writable_p;
229static Lisp_Object Qfile_symlink_p;
230static Lisp_Object Qaccess_file;
32f4334d 231Lisp_Object Qfile_directory_p;
955cbe7b
PE
232static Lisp_Object Qfile_regular_p;
233static Lisp_Object Qfile_accessible_directory_p;
234static Lisp_Object Qfile_modes;
235static Lisp_Object Qset_file_modes;
236static Lisp_Object Qset_file_times;
237static Lisp_Object Qfile_selinux_context;
238static Lisp_Object Qset_file_selinux_context;
239static Lisp_Object Qfile_newer_than_file_p;
32f4334d
RS
240Lisp_Object Qinsert_file_contents;
241Lisp_Object Qwrite_region;
955cbe7b
PE
242static Lisp_Object Qverify_visited_file_modtime;
243static Lisp_Object Qset_visited_file_modtime;
32f4334d 244
a7ca3326 245DEFUN ("find-file-name-handler", Ffind_file_name_handler,
16a97296 246 Sfind_file_name_handler, 2, 2, 0,
8c1a1077
PJ
247 doc: /* Return FILENAME's handler function for OPERATION, if it has one.
248Otherwise, return nil.
249A file name is handled if one of the regular expressions in
250`file-name-handler-alist' matches it.
251
252If OPERATION equals `inhibit-file-name-operation', then we ignore
253any handlers that are members of `inhibit-file-name-handlers',
254but we still do run any other handlers. This lets handlers
255use the standard functions without calling themselves recursively. */)
5842a27b 256 (Lisp_Object filename, Lisp_Object operation)
32f4334d 257{
642ef245 258 /* This function must not munge the match data. */
204ee271 259 Lisp_Object chain, inhibited_handlers, result;
8d2ced53 260 int pos = -1;
642ef245 261
204ee271 262 result = Qnil;
b7826503 263 CHECK_STRING (filename);
e4432095 264
a65970a0
RS
265 if (EQ (operation, Vinhibit_file_name_operation))
266 inhibited_handlers = Vinhibit_file_name_handlers;
267 else
268 inhibited_handlers = Qnil;
82c2d839 269
93c30b5f 270 for (chain = Vfile_name_handler_alist; CONSP (chain);
03699b14 271 chain = XCDR (chain))
32f4334d
RS
272 {
273 Lisp_Object elt;
03699b14 274 elt = XCAR (chain);
93c30b5f 275 if (CONSP (elt))
32f4334d 276 {
f6c9b683 277 Lisp_Object string = XCAR (elt);
a53e2e89 278 EMACS_INT match_pos;
f6c9b683 279 Lisp_Object handler = XCDR (elt);
68780e2a
RS
280 Lisp_Object operations = Qnil;
281
282 if (SYMBOLP (handler))
283 operations = Fget (handler, Qoperations);
f6c9b683 284
8d2ced53 285 if (STRINGP (string)
f6c9b683
RS
286 && (match_pos = fast_string_match (string, filename)) > pos
287 && (NILP (operations) || ! NILP (Fmemq (operation, operations))))
a65970a0 288 {
f6c9b683 289 Lisp_Object tem;
a65970a0 290
03699b14 291 handler = XCDR (elt);
a65970a0
RS
292 tem = Fmemq (handler, inhibited_handlers);
293 if (NILP (tem))
8d2ced53
SM
294 {
295 result = handler;
296 pos = match_pos;
297 }
a65970a0 298 }
32f4334d 299 }
642ef245
JB
300
301 QUIT;
32f4334d 302 }
8d2ced53 303 return result;
32f4334d
RS
304}
305\f
a7ca3326 306DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
8c1a1077
PJ
307 1, 1, 0,
308 doc: /* Return the directory component in file name FILENAME.
309Return nil if FILENAME does not include a directory.
78379264 310Otherwise return a directory name.
7c2fb837 311Given a Unix syntax file name, returns a string ending in slash. */)
5842a27b 312 (Lisp_Object filename)
570d7624 313{
100c44b7 314#ifndef DOS_NT
5976c3fe 315 register const char *beg;
100c44b7 316#else
5976c3fe 317 register char *beg;
100c44b7 318#endif
5976c3fe 319 register const char *p;
0bf2eed2 320 Lisp_Object handler;
570d7624 321
b7826503 322 CHECK_STRING (filename);
570d7624 323
0bf2eed2
RS
324 /* If the file name has special constructs in it,
325 call the corresponding file handler. */
3b7f6e60 326 handler = Ffind_file_name_handler (filename, Qfile_name_directory);
0bf2eed2 327 if (!NILP (handler))
3b7f6e60 328 return call2 (handler, Qfile_name_directory, filename);
0bf2eed2 329
3b7f6e60 330 filename = FILE_SYSTEM_CASE (filename);
199607e4 331#ifdef DOS_NT
5976c3fe
PE
332 beg = (char *) alloca (SBYTES (filename) + 1);
333 memcpy (beg, SSDATA (filename), SBYTES (filename) + 1);
0f3f018c 334#else
5976c3fe 335 beg = SSDATA (filename);
199607e4 336#endif
d5db4077 337 p = beg + SBYTES (filename);
570d7624 338
199607e4 339 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
199607e4 340#ifdef DOS_NT
ba14e174
RS
341 /* only recognise drive specifier at the beginning */
342 && !(p[-1] == ':'
343 /* handle the "/:d:foo" and "/:foo" cases correctly */
344 && ((p == beg + 2 && !IS_DIRECTORY_SEP (*beg))
345 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
199607e4 346#endif
570d7624
JB
347 ) p--;
348
349 if (p == beg)
350 return Qnil;
5e570b75 351#ifdef DOS_NT
4c3c22f3 352 /* Expansion of "c:" to drive and default directory. */
ba14e174 353 if (p[-1] == ':')
4c3c22f3 354 {
4c3c22f3 355 /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir. */
5976c3fe
PE
356 char *res = alloca (MAXPATHLEN + 1);
357 char *r = res;
ba14e174
RS
358
359 if (p == beg + 4 && IS_DIRECTORY_SEP (*beg) && beg[1] == ':')
360 {
361 strncpy (res, beg, 2);
362 beg += 2;
363 r += 2;
364 }
365
5976c3fe 366 if (getdefdir (toupper ((unsigned char) *beg) - 'A' + 1, r))
4c3c22f3 367 {
199607e4 368 if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
4c3c22f3
RS
369 strcat (res, "/");
370 beg = res;
371 p = beg + strlen (beg);
372 }
373 }
087fc47a 374 dostounix_filename (beg);
5e570b75 375#endif /* DOS_NT */
60d67b83 376
d7231f93 377 return make_specified_string (beg, -1, p - beg, STRING_MULTIBYTE (filename));
570d7624
JB
378}
379
a7ca3326 380DEFUN ("file-name-nondirectory", Ffile_name_nondirectory,
60d67b83 381 Sfile_name_nondirectory, 1, 1, 0,
8c1a1077
PJ
382 doc: /* Return file name FILENAME sans its directory.
383For example, in a Unix-syntax file name,
384this is everything after the last slash,
385or the entire name if it contains no slash. */)
5842a27b 386 (Lisp_Object filename)
570d7624 387{
5976c3fe 388 register const char *beg, *p, *end;
0bf2eed2 389 Lisp_Object handler;
570d7624 390
b7826503 391 CHECK_STRING (filename);
570d7624 392
0bf2eed2
RS
393 /* If the file name has special constructs in it,
394 call the corresponding file handler. */
3b7f6e60 395 handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory);
0bf2eed2 396 if (!NILP (handler))
3b7f6e60 397 return call2 (handler, Qfile_name_nondirectory, filename);
0bf2eed2 398
5976c3fe 399 beg = SSDATA (filename);
d5db4077 400 end = p = beg + SBYTES (filename);
570d7624 401
199607e4 402 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
199607e4
RS
403#ifdef DOS_NT
404 /* only recognise drive specifier at beginning */
ba14e174
RS
405 && !(p[-1] == ':'
406 /* handle the "/:d:foo" case correctly */
407 && (p == beg + 2 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
199607e4 408#endif
60d67b83
RS
409 )
410 p--;
570d7624 411
d7231f93 412 return make_specified_string (p, -1, end - p, STRING_MULTIBYTE (filename));
570d7624 413}
642ef245 414
a7ca3326 415DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory,
60d67b83 416 Sunhandled_file_name_directory, 1, 1, 0,
8c1a1077
PJ
417 doc: /* Return a directly usable directory name somehow associated with FILENAME.
418A `directly usable' directory name is one that may be used without the
419intervention of any file handler.
420If FILENAME is a directly usable file itself, return
421\(file-name-directory FILENAME).
ca319910
SM
422If FILENAME refers to a file which is not accessible from a local process,
423then this should return nil.
8c1a1077
PJ
424The `call-process' and `start-process' functions use this function to
425get a current directory to run processes in. */)
5842a27b 426 (Lisp_Object filename)
642ef245
JB
427{
428 Lisp_Object handler;
429
430 /* If the file name has special constructs in it,
431 call the corresponding file handler. */
49307295 432 handler = Ffind_file_name_handler (filename, Qunhandled_file_name_directory);
642ef245
JB
433 if (!NILP (handler))
434 return call2 (handler, Qunhandled_file_name_directory, filename);
435
436 return Ffile_name_directory (filename);
437}
438
570d7624 439\f
f14b7e14 440static char *
2893f146 441file_name_as_directory (char *out, const char *in)
570d7624 442{
93f4cf88 443 ptrdiff_t len = strlen (in);
570d7624 444
93f4cf88 445 if (len == 0)
8aa3a244 446 {
154a307d
KH
447 out[0] = '.';
448 out[1] = '/';
449 out[2] = 0;
8aa3a244
RS
450 return out;
451 }
452
93f4cf88
PE
453 strcpy (out, in);
454
570d7624 455 /* For Unix syntax, Append a slash if necessary */
93f4cf88 456 if (!IS_DIRECTORY_SEP (out[len - 1]))
5e570b75 457 {
93f4cf88
PE
458 out[len] = DIRECTORY_SEP;
459 out[len + 1] = '\0';
5e570b75 460 }
199607e4 461#ifdef DOS_NT
087fc47a 462 dostounix_filename (out);
199607e4 463#endif
570d7624
JB
464 return out;
465}
466
a7ca3326 467DEFUN ("file-name-as-directory", Ffile_name_as_directory,
570d7624 468 Sfile_name_as_directory, 1, 1, 0,
0dac4f85 469 doc: /* Return a string representing the file name FILE interpreted as a directory.
8c1a1077
PJ
470This operation exists because a directory is also a file, but its name as
471a directory is different from its name as a file.
472The result can be used as the value of `default-directory'
473or passed as second argument to `expand-file-name'.
7c2fb837 474For a Unix-syntax file name, just appends a slash. */)
5842a27b 475 (Lisp_Object file)
570d7624
JB
476{
477 char *buf;
0bf2eed2 478 Lisp_Object handler;
570d7624 479
b7826503 480 CHECK_STRING (file);
265a9e55 481 if (NILP (file))
570d7624 482 return Qnil;
0bf2eed2
RS
483
484 /* If the file name has special constructs in it,
485 call the corresponding file handler. */
49307295 486 handler = Ffind_file_name_handler (file, Qfile_name_as_directory);
0bf2eed2
RS
487 if (!NILP (handler))
488 return call2 (handler, Qfile_name_as_directory, file);
489
d5db4077 490 buf = (char *) alloca (SBYTES (file) + 10);
42a5b22f 491 file_name_as_directory (buf, SSDATA (file));
d7231f93
KH
492 return make_specified_string (buf, -1, strlen (buf),
493 STRING_MULTIBYTE (file));
570d7624
JB
494}
495\f
496/*
497 * Convert from directory name to filename.
199607e4 498 * On UNIX, it's simple: just make sure there isn't a terminating /
570d7624
JB
499
500 * Value is nonzero if the string output is different from the input.
501 */
502
f14b7e14 503static int
971de7fb 504directory_file_name (char *src, char *dst)
570d7624 505{
93f4cf88 506 ptrdiff_t slen;
570d7624
JB
507
508 slen = strlen (src);
7c2fb837 509
570d7624
JB
510 /* Process as Unix format: just remove any final slash.
511 But leave "/" unchanged; do not change it to "". */
512 strcpy (dst, src);
199607e4 513 if (slen > 1
5e570b75 514 && IS_DIRECTORY_SEP (dst[slen - 1])
4592782e
RS
515#ifdef DOS_NT
516 && !IS_ANY_SEP (dst[slen - 2])
517#endif
518 )
570d7624 519 dst[slen - 1] = 0;
199607e4 520#ifdef DOS_NT
087fc47a 521 dostounix_filename (dst);
125feee8 522#endif
570d7624
JB
523 return 1;
524}
525
a7ca3326 526DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
8c1a1077
PJ
527 1, 1, 0,
528 doc: /* Returns the file name of the directory named DIRECTORY.
529This is the name of the file that holds the data for the directory DIRECTORY.
530This operation exists because a directory is also a file, but its name as
531a directory is different from its name as a file.
7c2fb837 532In Unix-syntax, this function just removes the final slash. */)
5842a27b 533 (Lisp_Object directory)
570d7624
JB
534{
535 char *buf;
0bf2eed2 536 Lisp_Object handler;
570d7624 537
b7826503 538 CHECK_STRING (directory);
570d7624 539
265a9e55 540 if (NILP (directory))
570d7624 541 return Qnil;
0bf2eed2
RS
542
543 /* If the file name has special constructs in it,
544 call the corresponding file handler. */
49307295 545 handler = Ffind_file_name_handler (directory, Qdirectory_file_name);
0bf2eed2
RS
546 if (!NILP (handler))
547 return call2 (handler, Qdirectory_file_name, directory);
548
d5db4077 549 buf = (char *) alloca (SBYTES (directory) + 20);
42a5b22f 550 directory_file_name (SSDATA (directory), buf);
d7231f93
KH
551 return make_specified_string (buf, -1, strlen (buf),
552 STRING_MULTIBYTE (directory));
570d7624
JB
553}
554
91433552 555static const char make_temp_name_tbl[64] =
3ce839e4
RS
556{
557 'A','B','C','D','E','F','G','H',
558 'I','J','K','L','M','N','O','P',
559 'Q','R','S','T','U','V','W','X',
560 'Y','Z','a','b','c','d','e','f',
561 'g','h','i','j','k','l','m','n',
562 'o','p','q','r','s','t','u','v',
563 'w','x','y','z','0','1','2','3',
564 '4','5','6','7','8','9','-','_'
565};
cb613bb8 566
3ce839e4
RS
567static unsigned make_temp_name_count, make_temp_name_count_initialized_p;
568
cb613bb8 569/* Value is a temporary file name starting with PREFIX, a string.
efdc16c9 570
cb613bb8
GM
571 The Emacs process number forms part of the result, so there is
572 no danger of generating a name being used by another process.
573 In addition, this function makes an attempt to choose a name
574 which has no existing file. To make this work, PREFIX should be
575 an absolute file name.
efdc16c9 576
cb613bb8
GM
577 BASE64_P non-zero means add the pid as 3 characters in base64
578 encoding. In this case, 6 characters will be added to PREFIX to
579 form the file name. Otherwise, if Emacs is running on a system
580 with long file names, add the pid as a decimal number.
581
582 This function signals an error if no unique file name could be
583 generated. */
584
585Lisp_Object
971de7fb 586make_temp_name (Lisp_Object prefix, int base64_p)
570d7624
JB
587{
588 Lisp_Object val;
0cedd530 589 int len, clen;
93f4cf88 590 intmax_t pid;
5976c3fe 591 char *p, *data;
93f4cf88 592 char pidbuf[INT_BUFSIZE_BOUND (pid_t)];
3ce839e4 593 int pidlen;
efdc16c9 594
b7826503 595 CHECK_STRING (prefix);
3ce839e4
RS
596
597 /* VAL is created by adding 6 characters to PREFIX. The first
598 three are the PID of this process, in base 64, and the second
599 three are incremented if the file already exists. This ensures
600 262144 unique file names per PID per PREFIX. */
601
93f4cf88 602 pid = getpid ();
3ce839e4 603
cb613bb8
GM
604 if (base64_p)
605 {
606 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
607 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
608 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
609 pidlen = 3;
610 }
611 else
612 {
3ce839e4 613#ifdef HAVE_LONG_FILE_NAMES
93f4cf88 614 pidlen = sprintf (pidbuf, "%"PRIdMAX, pid);
3a3bfb18 615#else
cb613bb8
GM
616 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
617 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
618 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
619 pidlen = 3;
3ce839e4 620#endif
cb613bb8 621 }
efdc16c9 622
0cedd530
SM
623 len = SBYTES (prefix); clen = SCHARS (prefix);
624 val = make_uninit_multibyte_string (clen + 3 + pidlen, len + 3 + pidlen);
625 if (!STRING_MULTIBYTE (prefix))
626 STRING_SET_UNIBYTE (val);
5976c3fe
PE
627 data = SSDATA (val);
628 memcpy (data, SSDATA (prefix), len);
3ce839e4
RS
629 p = data + len;
630
72af86bd 631 memcpy (p, pidbuf, pidlen);
3ce839e4
RS
632 p += pidlen;
633
634 /* Here we try to minimize useless stat'ing when this function is
635 invoked many times successively with the same PREFIX. We achieve
636 this by initializing count to a random value, and incrementing it
f6a492a9
RS
637 afterwards.
638
639 We don't want make-temp-name to be called while dumping,
640 because then make_temp_name_count_initialized_p would get set
641 and then make_temp_name_count would not be set when Emacs starts. */
642
3ce839e4
RS
643 if (!make_temp_name_count_initialized_p)
644 {
327eeec8 645 make_temp_name_count = time (NULL);
3ce839e4
RS
646 make_temp_name_count_initialized_p = 1;
647 }
648
649 while (1)
650 {
651 struct stat ignored;
8a7777fc 652 unsigned num = make_temp_name_count;
3ce839e4
RS
653
654 p[0] = make_temp_name_tbl[num & 63], num >>= 6;
655 p[1] = make_temp_name_tbl[num & 63], num >>= 6;
656 p[2] = make_temp_name_tbl[num & 63], num >>= 6;
657
8a7777fc
RS
658 /* Poor man's congruential RN generator. Replace with
659 ++make_temp_name_count for debugging. */
660 make_temp_name_count += 25229;
661 make_temp_name_count %= 225307;
662
3ce839e4
RS
663 if (stat (data, &ignored) < 0)
664 {
665 /* We want to return only if errno is ENOENT. */
666 if (errno == ENOENT)
667 return val;
668 else
669 /* The error here is dubious, but there is little else we
670 can do. The alternatives are to return nil, which is
671 as bad as (and in many cases worse than) throwing the
672 error, or to ignore the error, which will likely result
8a7777fc 673 in looping through 225307 stat's, which is not only
410ed5c3
PE
674 dog-slow, but also useless since eventually nil would
675 have to be returned anyway. */
9869bb0b 676 report_file_error ("Cannot create temporary name for prefix",
3ce839e4
RS
677 Fcons (prefix, Qnil));
678 /* not reached */
679 }
680 }
570d7624 681}
3ce839e4 682
cb613bb8
GM
683
684DEFUN ("make-temp-name", Fmake_temp_name, Smake_temp_name, 1, 1, 0,
8c1a1077
PJ
685 doc: /* Generate temporary file name (string) starting with PREFIX (a string).
686The Emacs process number forms part of the result,
687so there is no danger of generating a name being used by another process.
688
689In addition, this function makes an attempt to choose a name
690which has no existing file. To make this work,
691PREFIX should be an absolute file name.
692
693There is a race condition between calling `make-temp-name' and creating the
694file which opens all kinds of security holes. For that reason, you should
f9e6f049
RS
695probably use `make-temp-file' instead, except in three circumstances:
696
697* If you are creating the file in the user's home directory.
698* If you are creating a directory rather than an ordinary file.
699* If you are taking special precautions as `make-temp-file' does. */)
5842a27b 700 (Lisp_Object prefix)
cb613bb8
GM
701{
702 return make_temp_name (prefix, 0);
703}
704
705
570d7624 706\f
a7ca3326 707DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
8c1a1077
PJ
708 doc: /* Convert filename NAME to absolute, and canonicalize it.
709Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative
78379264 710\(does not start with slash or tilde); if DEFAULT-DIRECTORY is nil or missing,
a4e03fe5 711the current buffer's value of `default-directory' is used.
1b2a627f
EZ
712NAME should be a string that is a valid file name for the underlying
713filesystem.
8c1a1077
PJ
714File name components that are `.' are removed, and
715so are file name components followed by `..', along with the `..' itself;
716note that these simplifications are done without checking the resulting
717file names in the file system.
15579471
EZ
718Multiple consecutive slashes are collapsed into a single slash,
719except at the beginning of the file name when they are significant (e.g.,
720UNC file names on MS-Windows.)
8c1a1077
PJ
721An initial `~/' expands to your home directory.
722An initial `~USER/' expands to USER's home directory.
07114296
CY
723See also the function `substitute-in-file-name'.
724
725For technical reasons, this function can return correct but
726non-intuitive results for the root directory; for instance,
727\(expand-file-name ".." "/") returns "/..". For this reason, use
15579471 728\(directory-file-name (file-name-directory dirname)) to traverse a
07114296 729filesystem tree, not (expand-file-name ".." dirname). */)
5842a27b 730 (Lisp_Object name, Lisp_Object default_directory)
570d7624 731{
5b5a2ea1
SM
732 /* These point to SDATA and need to be careful with string-relocation
733 during GC (via DECODE_FILE). */
2893f146
PE
734 char *nm;
735 const char *newdir;
5b5a2ea1 736 /* This should only point to alloca'd data. */
5976c3fe 737 char *target;
199607e4 738
93f4cf88 739 ptrdiff_t tlen;
570d7624 740 struct passwd *pw;
5e570b75 741#ifdef DOS_NT
199607e4 742 int drive = 0;
9a1dc3be 743 int collapse_newdir = 1;
f0f95d31 744 int is_escaped = 0;
5e570b75 745#endif /* DOS_NT */
93f4cf88 746 ptrdiff_t length;
beb402de 747 Lisp_Object handler, result;
2b046a72 748 int multibyte;
9c06a1f3 749 Lisp_Object hdir;
199607e4 750
b7826503 751 CHECK_STRING (name);
570d7624 752
0bf2eed2
RS
753 /* If the file name has special constructs in it,
754 call the corresponding file handler. */
49307295 755 handler = Ffind_file_name_handler (name, Qexpand_file_name);
0bf2eed2 756 if (!NILP (handler))
3b7f6e60 757 return call3 (handler, Qexpand_file_name, name, default_directory);
58fc9587 758
3b7f6e60
EN
759 /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted. */
760 if (NILP (default_directory))
4b4deea2 761 default_directory = BVAR (current_buffer, directory);
82330e7f 762 if (! STRINGP (default_directory))
dd693537
EZ
763 {
764#ifdef DOS_NT
765 /* "/" is not considered a root directory on DOS_NT, so using "/"
766 here causes an infinite recursion in, e.g., the following:
767
768 (let (default-directory)
769 (expand-file-name "a"))
770
771 To avoid this, we set default_directory to the root of the
772 current drive. */
dd693537
EZ
773 default_directory = build_string (emacs_root_dir ());
774#else
775 default_directory = build_string ("/");
776#endif
777 }
58fc9587 778
3b7f6e60 779 if (!NILP (default_directory))
273e0829 780 {
3b7f6e60 781 handler = Ffind_file_name_handler (default_directory, Qexpand_file_name);
273e0829 782 if (!NILP (handler))
3b7f6e60 783 return call3 (handler, Qexpand_file_name, name, default_directory);
273e0829 784 }
0bf2eed2 785
5b5a2ea1 786 {
5976c3fe 787 char *o = SSDATA (default_directory);
5b5a2ea1
SM
788
789 /* Make sure DEFAULT_DIRECTORY is properly expanded.
790 It would be better to do this down below where we actually use
791 default_directory. Unfortunately, calling Fexpand_file_name recursively
792 could invoke GC, and the strings might be relocated. This would
793 be annoying because we have pointers into strings lying around
794 that would need adjusting, and people would add new pointers to
795 the code and forget to adjust them, resulting in intermittent bugs.
796 Putting this call here avoids all that crud.
797
798 The EQ test avoids infinite recursion. */
799 if (! NILP (default_directory) && !EQ (default_directory, name)
800 /* Save time in some common cases - as long as default_directory
801 is not relative, it can be canonicalized with name below (if it
802 is needed at all) without requiring it to be expanded now. */
01937013 803#ifdef DOS_NT
5b5a2ea1
SM
804 /* Detect MSDOS file names with drive specifiers. */
805 && ! (IS_DRIVE (o[0]) && IS_DEVICE_SEP (o[1])
806 && IS_DIRECTORY_SEP (o[2]))
199607e4 807#ifdef WINDOWSNT
5b5a2ea1
SM
808 /* Detect Windows file names in UNC format. */
809 && ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
01937013 810#endif
199607e4
RS
811#else /* not DOS_NT */
812 /* Detect Unix absolute file names (/... alone is not absolute on
813 DOS or Windows). */
5b5a2ea1 814 && ! (IS_DIRECTORY_SEP (o[0]))
199607e4 815#endif /* not DOS_NT */
5b5a2ea1
SM
816 )
817 {
818 struct gcpro gcpro1;
f14b1c68 819
5b5a2ea1
SM
820 GCPRO1 (name);
821 default_directory = Fexpand_file_name (default_directory, Qnil);
822 UNGCPRO;
823 }
824 }
4c3c22f3 825 name = FILE_SYSTEM_CASE (name);
2b046a72 826 multibyte = STRING_MULTIBYTE (name);
6d060996
KH
827 if (multibyte != STRING_MULTIBYTE (default_directory))
828 {
829 if (multibyte)
830 default_directory = string_to_multibyte (default_directory);
831 else
832 {
833 name = string_to_multibyte (name);
834 multibyte = 1;
835 }
836 }
837
565f0b98 838 /* Make a local copy of nm[] to protect it from GC in DECODE_FILE below. */
5976c3fe
PE
839 nm = (char *) alloca (SBYTES (name) + 1);
840 memcpy (nm, SSDATA (name), SBYTES (name) + 1);
199607e4 841
565f0b98 842#ifdef DOS_NT
f0f95d31
RS
843 /* Note if special escape prefix is present, but remove for now. */
844 if (nm[0] == '/' && nm[1] == ':')
845 {
846 is_escaped = 1;
847 nm += 2;
848 }
849
199607e4 850 /* Find and remove drive specifier if present; this makes nm absolute
f0f95d31
RS
851 even if the rest of the name appears to be relative. Only look for
852 drive specifier at the beginning. */
853 if (IS_DRIVE (nm[0]) && IS_DEVICE_SEP (nm[1]))
854 {
5976c3fe 855 drive = (unsigned char) nm[0];
f0f95d31
RS
856 nm += 2;
857 }
bb1ff1f4
GV
858
859#ifdef WINDOWSNT
860 /* If we see "c://somedir", we want to strip the first slash after the
861 colon when stripping the drive letter. Otherwise, this expands to
862 "//somedir". */
863 if (drive && IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
864 nm++;
4c3c22f3 865
199607e4
RS
866 /* Discard any previous drive specifier if nm is now in UNC format. */
867 if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
868 {
869 drive = 0;
870 }
5b5a2ea1
SM
871#endif /* WINDOWSNT */
872#endif /* DOS_NT */
199607e4 873
214378ec
GM
874 /* If nm is absolute, look for `/./' or `/../' or `//''sequences; if
875 none are found, we can probably return right away. We will avoid
876 allocating a new string if name is already fully expanded. */
570d7624 877 if (
5e570b75 878 IS_DIRECTORY_SEP (nm[0])
199607e4 879#ifdef MSDOS
f0f95d31 880 && drive && !is_escaped
199607e4
RS
881#endif
882#ifdef WINDOWSNT
f0f95d31 883 && (drive || IS_DIRECTORY_SEP (nm[1])) && !is_escaped
199607e4 884#endif
570d7624
JB
885 )
886 {
f14b1c68
JB
887 /* If it turns out that the filename we want to return is just a
888 suffix of FILENAME, we don't need to go through and edit
889 things; we just need to construct a new string using data
890 starting at the middle of FILENAME. If we set lose to a
891 non-zero value, that means we've discovered that we can't do
892 that cool trick. */
893 int lose = 0;
5976c3fe 894 char *p = nm;
f14b1c68 895
570d7624
JB
896 while (*p)
897 {
199607e4 898 /* Since we know the name is absolute, we can assume that each
c77d647e
JB
899 element starts with a "/". */
900
c77d647e 901 /* "." and ".." are hairy. */
5e570b75 902 if (IS_DIRECTORY_SEP (p[0])
c77d647e 903 && p[1] == '.'
5e570b75 904 && (IS_DIRECTORY_SEP (p[2])
c77d647e 905 || p[2] == 0
5e570b75 906 || (p[2] == '.' && (IS_DIRECTORY_SEP (p[3])
c77d647e 907 || p[3] == 0))))
570d7624 908 lose = 1;
214378ec
GM
909 /* We want to replace multiple `/' in a row with a single
910 slash. */
911 else if (p > nm
912 && IS_DIRECTORY_SEP (p[0])
913 && IS_DIRECTORY_SEP (p[1]))
914 lose = 1;
570d7624
JB
915 p++;
916 }
917 if (!lose)
918 {
199607e4 919#ifdef DOS_NT
087fc47a
JB
920 /* Make sure directories are all separated with /, but
921 avoid allocation of a new string when not required. */
922 dostounix_filename (nm);
199607e4
RS
923#ifdef WINDOWSNT
924 if (IS_DIRECTORY_SEP (nm[1]))
925 {
42a5b22f 926 if (strcmp (nm, SSDATA (name)) != 0)
2b046a72 927 name = make_specified_string (nm, -1, strlen (nm), multibyte);
199607e4
RS
928 }
929 else
930#endif
931 /* drive must be set, so this is okay */
5976c3fe 932 if (strcmp (nm - 2, SSDATA (name)) != 0)
199607e4 933 {
3f817c73
KH
934 char temp[] = " :";
935
2b046a72 936 name = make_specified_string (nm, -1, p - nm, multibyte);
3f817c73
KH
937 temp[0] = DRIVE_LETTER (drive);
938 name = concat2 (build_string (temp), name);
199607e4
RS
939 }
940 return name;
941#else /* not DOS_NT */
42a5b22f 942 if (strcmp (nm, SSDATA (name)) == 0)
570d7624 943 return name;
2b046a72 944 return make_specified_string (nm, -1, strlen (nm), multibyte);
5e570b75 945#endif /* not DOS_NT */
570d7624
JB
946 }
947 }
948
199607e4
RS
949 /* At this point, nm might or might not be an absolute file name. We
950 need to expand ~ or ~user if present, otherwise prefix nm with
951 default_directory if nm is not absolute, and finally collapse /./
952 and /foo/../ sequences.
953
954 We set newdir to be the appropriate prefix if one is needed:
955 - the relevant user directory if nm starts with ~ or ~user
956 - the specified drive's working dir (DOS/NT only) if nm does not
957 start with /
958 - the value of default_directory.
959
960 Note that these prefixes are not guaranteed to be absolute (except
961 for the working dir of a drive). Therefore, to ensure we always
962 return an absolute name, if the final prefix is not absolute we
963 append it to the current working directory. */
570d7624
JB
964
965 newdir = 0;
966
967 if (nm[0] == '~') /* prefix ~ */
c77d647e 968 {
5e570b75 969 if (IS_DIRECTORY_SEP (nm[1])
c77d647e
JB
970 || nm[1] == 0) /* ~ by itself */
971 {
6d557778
EZ
972 Lisp_Object tem;
973
5976c3fe
PE
974 if (!(newdir = egetenv ("HOME")))
975 newdir = "";
199607e4 976 nm++;
6d557778
EZ
977 /* egetenv may return a unibyte string, which will bite us since
978 we expect the directory to be multibyte. */
9c06a1f3
EZ
979 tem = build_string (newdir);
980 if (!STRING_MULTIBYTE (tem))
981 {
982 hdir = DECODE_FILE (tem);
5976c3fe 983 newdir = SSDATA (hdir);
9c06a1f3 984 }
5e570b75 985#ifdef DOS_NT
9a1dc3be 986 collapse_newdir = 0;
4c3c22f3 987#endif
c77d647e
JB
988 }
989 else /* ~user/filename */
990 {
5976c3fe 991 char *o, *p;
7c2fb837 992 for (p = nm; *p && (!IS_DIRECTORY_SEP (*p)); p++);
5b5a2ea1 993 o = alloca (p - nm + 1);
72af86bd 994 memcpy (o, nm, p - nm);
c77d647e
JB
995 o [p - nm] = 0;
996
67c08d6c 997 BLOCK_INPUT;
c77d647e 998 pw = (struct passwd *) getpwnam (o + 1);
67c08d6c 999 UNBLOCK_INPUT;
c77d647e
JB
1000 if (pw)
1001 {
5976c3fe 1002 newdir = pw->pw_dir;
c77d647e 1003 nm = p;
199607e4 1004#ifdef DOS_NT
9a1dc3be 1005 collapse_newdir = 0;
199607e4 1006#endif
c77d647e 1007 }
e5d77022 1008
c77d647e
JB
1009 /* If we don't find a user of that name, leave the name
1010 unchanged; don't move nm forward to p. */
1011 }
1012 }
570d7624 1013
5e570b75 1014#ifdef DOS_NT
199607e4
RS
1015 /* On DOS and Windows, nm is absolute if a drive name was specified;
1016 use the drive's current directory as the prefix if needed. */
1017 if (!newdir && drive)
1018 {
1019 /* Get default directory if needed to make nm absolute. */
2893f146 1020 char *adir = NULL;
199607e4
RS
1021 if (!IS_DIRECTORY_SEP (nm[0]))
1022 {
2893f146
PE
1023 adir = alloca (MAXPATHLEN + 1);
1024 if (!getdefdir (toupper (drive) - 'A' + 1, adir))
1025 adir = NULL;
199607e4 1026 }
2893f146 1027 if (!adir)
199607e4
RS
1028 {
1029 /* Either nm starts with /, or drive isn't mounted. */
2893f146
PE
1030 adir = alloca (4);
1031 adir[0] = DRIVE_LETTER (drive);
1032 adir[1] = ':';
1033 adir[2] = '/';
1034 adir[3] = 0;
199607e4 1035 }
2893f146 1036 newdir = adir;
199607e4 1037 }
5e570b75 1038#endif /* DOS_NT */
199607e4
RS
1039
1040 /* Finally, if no prefix has been specified and nm is not absolute,
1041 then it must be expanded relative to default_directory. */
1042
34097368 1043 if (1
199607e4
RS
1044#ifndef DOS_NT
1045 /* /... alone is not absolute on DOS and Windows. */
34097368 1046 && !IS_DIRECTORY_SEP (nm[0])
199607e4
RS
1047#endif
1048#ifdef WINDOWSNT
34097368 1049 && !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
199607e4 1050#endif
570d7624
JB
1051 && !newdir)
1052 {
5976c3fe 1053 newdir = SSDATA (default_directory);
f0f95d31
RS
1054#ifdef DOS_NT
1055 /* Note if special escape prefix is present, but remove for now. */
1056 if (newdir[0] == '/' && newdir[1] == ':')
1057 {
1058 is_escaped = 1;
1059 newdir += 2;
1060 }
1061#endif
570d7624
JB
1062 }
1063
5e570b75 1064#ifdef DOS_NT
199607e4
RS
1065 if (newdir)
1066 {
1067 /* First ensure newdir is an absolute name. */
1068 if (
1069 /* Detect MSDOS file names with drive specifiers. */
1070 ! (IS_DRIVE (newdir[0])
1071 && IS_DEVICE_SEP (newdir[1]) && IS_DIRECTORY_SEP (newdir[2]))
1072#ifdef WINDOWSNT
1073 /* Detect Windows file names in UNC format. */
1074 && ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1075#endif
1076 )
1077 {
1078 /* Effectively, let newdir be (expand-file-name newdir cwd).
1079 Because of the admonition against calling expand-file-name
1080 when we have pointers into lisp strings, we accomplish this
1081 indirectly by prepending newdir to nm if necessary, and using
1082 cwd (or the wd of newdir's drive) as the new newdir. */
2893f146 1083 char *adir;
c70a4df6 1084 if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
199607e4 1085 {
5976c3fe 1086 drive = (unsigned char) newdir[0];
199607e4
RS
1087 newdir += 2;
1088 }
1089 if (!IS_DIRECTORY_SEP (nm[0]))
1090 {
1091 char * tmp = alloca (strlen (newdir) + strlen (nm) + 2);
1092 file_name_as_directory (tmp, newdir);
1093 strcat (tmp, nm);
1094 nm = tmp;
1095 }
2893f146 1096 adir = alloca (MAXPATHLEN + 1);
199607e4
RS
1097 if (drive)
1098 {
2893f146 1099 if (!getdefdir (toupper (drive) - 'A' + 1, adir))
199607e4
RS
1100 newdir = "/";
1101 }
1102 else
2893f146
PE
1103 getwd (adir);
1104 newdir = adir;
199607e4
RS
1105 }
1106
1107 /* Strip off drive name from prefix, if present. */
c70a4df6 1108 if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
199607e4
RS
1109 {
1110 drive = newdir[0];
1111 newdir += 2;
1112 }
1113
1114 /* Keep only a prefix from newdir if nm starts with slash
82330e7f 1115 (//server/share for UNC, nothing otherwise). */
9a1dc3be 1116 if (IS_DIRECTORY_SEP (nm[0]) && collapse_newdir)
199607e4
RS
1117 {
1118#ifdef WINDOWSNT
1119 if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1120 {
2893f146
PE
1121 char *adir = strcpy (alloca (strlen (newdir) + 1), newdir);
1122 char *p = adir + 2;
199607e4
RS
1123 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1124 p++;
1125 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1126 *p = 0;
2893f146 1127 newdir = adir;
199607e4
RS
1128 }
1129 else
1130#endif
1131 newdir = "";
1132 }
1133 }
5e570b75 1134#endif /* DOS_NT */
199607e4
RS
1135
1136 if (newdir)
bfb61299 1137 {
57676091 1138 /* Get rid of any slash at the end of newdir, unless newdir is
f0f95d31 1139 just / or // (an incomplete UNC name). */
199607e4 1140 length = strlen (newdir);
f0f95d31 1141 if (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
57676091
RS
1142#ifdef WINDOWSNT
1143 && !(length == 2 && IS_DIRECTORY_SEP (newdir[0]))
1144#endif
1145 )
bfb61299 1146 {
5976c3fe 1147 char *temp = (char *) alloca (length);
72af86bd 1148 memcpy (temp, newdir, length - 1);
bfb61299
JB
1149 temp[length - 1] = 0;
1150 newdir = temp;
1151 }
1152 tlen = length + 1;
1153 }
1154 else
1155 tlen = 0;
570d7624 1156
bfb61299
JB
1157 /* Now concatenate the directory and name to new space in the stack frame */
1158 tlen += strlen (nm) + 1;
5e570b75 1159#ifdef DOS_NT
f0f95d31
RS
1160 /* Reserve space for drive specifier and escape prefix, since either
1161 or both may need to be inserted. (The Microsoft x86 compiler
5e570b75 1162 produces incorrect code if the following two lines are combined.) */
5976c3fe 1163 target = (char *) alloca (tlen + 4);
f0f95d31 1164 target += 4;
5e570b75 1165#else /* not DOS_NT */
5976c3fe 1166 target = (char *) alloca (tlen);
5e570b75 1167#endif /* not DOS_NT */
570d7624
JB
1168 *target = 0;
1169
1170 if (newdir)
1171 {
5e570b75 1172 if (nm[0] == 0 || IS_DIRECTORY_SEP (nm[0]))
f5321b5c 1173 {
3ea2d8b2 1174#ifdef DOS_NT
f5321b5c
RS
1175 /* If newdir is effectively "C:/", then the drive letter will have
1176 been stripped and newdir will be "/". Concatenating with an
1177 absolute directory in nm produces "//", which will then be
1178 incorrectly treated as a network share. Ignore newdir in
1179 this case (keeping the drive letter). */
efdc16c9 1180 if (!(drive && nm[0] && IS_DIRECTORY_SEP (newdir[0])
f5321b5c
RS
1181 && newdir[1] == '\0'))
1182#endif
1183 strcpy (target, newdir);
1184 }
570d7624 1185 else
c77d647e 1186 file_name_as_directory (target, newdir);
570d7624
JB
1187 }
1188
1189 strcat (target, nm);
199607e4 1190
214378ec
GM
1191 /* Now canonicalize by removing `//', `/.' and `/foo/..' if they
1192 appear. */
5b5a2ea1 1193 {
5976c3fe
PE
1194 char *p = target;
1195 char *o = target;
570d7624 1196
5b5a2ea1
SM
1197 while (*p)
1198 {
5b5a2ea1
SM
1199 if (!IS_DIRECTORY_SEP (*p))
1200 {
1201 *o++ = *p++;
1202 }
1203 else if (p[1] == '.'
1204 && (IS_DIRECTORY_SEP (p[2])
1205 || p[2] == 0))
1206 {
1207 /* If "/." is the entire filename, keep the "/". Otherwise,
1208 just delete the whole "/.". */
1209 if (o == target && p[2] == '\0')
1210 *o++ = *p;
1211 p += 2;
1212 }
1213 else if (p[1] == '.' && p[2] == '.'
1214 /* `/../' is the "superroot" on certain file systems.
1215 Turned off on DOS_NT systems because they have no
1216 "superroot" and because this causes us to produce
1217 file names like "d:/../foo" which fail file-related
1218 functions of the underlying OS. (To reproduce, try a
1219 long series of "../../" in default_directory, longer
1220 than the number of levels from the root.) */
aa4060b9 1221#ifndef DOS_NT
5b5a2ea1 1222 && o != target
aa4060b9 1223#endif
5b5a2ea1
SM
1224 && (IS_DIRECTORY_SEP (p[3]) || p[3] == 0))
1225 {
972ed246 1226#ifdef WINDOWSNT
5976c3fe 1227 char *prev_o = o;
972ed246 1228#endif
5b5a2ea1
SM
1229 while (o != target && (--o) && !IS_DIRECTORY_SEP (*o))
1230 ;
972ed246
JR
1231#ifdef WINDOWSNT
1232 /* Don't go below server level in UNC filenames. */
1233 if (o == target + 1 && IS_DIRECTORY_SEP (*o)
1234 && IS_DIRECTORY_SEP (*target))
1235 o = prev_o;
1236 else
1237#endif
5b5a2ea1
SM
1238 /* Keep initial / only if this is the whole name. */
1239 if (o == target && IS_ANY_SEP (*o) && p[3] == 0)
1240 ++o;
1241 p += 3;
1242 }
1243 else if (p > target && IS_DIRECTORY_SEP (p[1]))
1244 /* Collapse multiple `/' in a row. */
1245 p++;
1246 else
1247 {
1248 *o++ = *p++;
1249 }
5b5a2ea1 1250 }
570d7624 1251
5e570b75 1252#ifdef DOS_NT
5b5a2ea1 1253 /* At last, set drive name. */
5e570b75 1254#ifdef WINDOWSNT
5b5a2ea1
SM
1255 /* Except for network file name. */
1256 if (!(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1])))
5e570b75 1257#endif /* WINDOWSNT */
5b5a2ea1
SM
1258 {
1259 if (!drive) abort ();
1260 target -= 2;
1261 target[0] = DRIVE_LETTER (drive);
1262 target[1] = ':';
1263 }
1264 /* Reinsert the escape prefix if required. */
1265 if (is_escaped)
1266 {
1267 target -= 2;
1268 target[0] = '/';
1269 target[1] = ':';
1270 }
087fc47a 1271 dostounix_filename (target);
5e570b75 1272#endif /* DOS_NT */
4c3c22f3 1273
5b5a2ea1
SM
1274 result = make_specified_string (target, -1, o - target, multibyte);
1275 }
beb402de
KG
1276
1277 /* Again look to see if the file name has special constructs in it
1278 and perhaps call the corresponding file handler. This is needed
1279 for filenames such as "/foo/../user@host:/bar/../baz". Expanding
1280 the ".." component gives us "/user@host:/bar/../baz" which needs
1281 to be expanded again. */
1282 handler = Ffind_file_name_handler (result, Qexpand_file_name);
1283 if (!NILP (handler))
1284 return call3 (handler, Qexpand_file_name, result, default_directory);
1285
1286 return result;
570d7624 1287}
5e570b75 1288
4887597a
EZ
1289#if 0
1290/* PLEASE DO NOT DELETE THIS COMMENTED-OUT VERSION!
1291 This is the old version of expand-file-name, before it was thoroughly
1292 rewritten for Emacs 10.31. We leave this version here commented-out,
1293 because the code is very complex and likely to have subtle bugs. If
1294 bugs _are_ found, it might be of interest to look at the old code and
1295 see what did it do in the relevant situation.
1296
30f50381
GM
1297 Don't remove this code: it's true that it will be accessible
1298 from the repository, but a few years from deletion, people will
1299 forget it is there. */
4887597a
EZ
1300
1301/* Changed this DEFUN to a DEAFUN, so as not to confuse `make-docfile'. */
1302DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
1303 "Convert FILENAME to absolute, and canonicalize it.\n\
1304Second arg DEFAULT is directory to start with if FILENAME is relative\n\
c70a4df6 1305\(does not start with slash); if DEFAULT is nil or missing,\n\
4887597a
EZ
1306the current buffer's value of default-directory is used.\n\
1307Filenames containing `.' or `..' as components are simplified;\n\
1308initial `~/' expands to your home directory.\n\
1309See also the function `substitute-in-file-name'.")
1310 (name, defalt)
1311 Lisp_Object name, defalt;
1312{
1313 unsigned char *nm;
1314
1315 register unsigned char *newdir, *p, *o;
93f4cf88 1316 ptrdiff_t tlen;
4887597a
EZ
1317 unsigned char *target;
1318 struct passwd *pw;
1319 int lose;
4887597a 1320
b7826503 1321 CHECK_STRING (name);
d5db4077 1322 nm = SDATA (name);
4887597a
EZ
1323
1324 /* If nm is absolute, flush ...// and detect /./ and /../.
1325 If no /./ or /../ we can return right away. */
7c2fb837 1326 if (nm[0] == '/')
4887597a
EZ
1327 {
1328 p = nm;
1329 lose = 0;
1330 while (*p)
1331 {
1332 if (p[0] == '/' && p[1] == '/'
4887597a
EZ
1333 )
1334 nm = p + 1;
1335 if (p[0] == '/' && p[1] == '~')
1336 nm = p + 1, lose = 1;
1337 if (p[0] == '/' && p[1] == '.'
1338 && (p[2] == '/' || p[2] == 0
1339 || (p[2] == '.' && (p[3] == '/' || p[3] == 0))))
1340 lose = 1;
4887597a
EZ
1341 p++;
1342 }
1343 if (!lose)
1344 {
d5db4077 1345 if (nm == SDATA (name))
4887597a
EZ
1346 return name;
1347 return build_string (nm);
1348 }
1349 }
1350
1351 /* Now determine directory to start with and put it in NEWDIR */
1352
1353 newdir = 0;
1354
1355 if (nm[0] == '~') /* prefix ~ */
7c2fb837 1356 if (nm[1] == '/' || nm[1] == 0)/* ~/filename */
4887597a
EZ
1357 {
1358 if (!(newdir = (unsigned char *) egetenv ("HOME")))
1359 newdir = (unsigned char *) "";
1360 nm++;
4887597a
EZ
1361 }
1362 else /* ~user/filename */
1363 {
1364 /* Get past ~ to user */
1365 unsigned char *user = nm + 1;
1366 /* Find end of name. */
8966b757 1367 unsigned char *ptr = (unsigned char *) strchr (user, '/');
93f4cf88 1368 ptrdiff_t len = ptr ? ptr - user : strlen (user);
4887597a
EZ
1369 /* Copy the user name into temp storage. */
1370 o = (unsigned char *) alloca (len + 1);
72af86bd 1371 memcpy (o, user, len);
4887597a
EZ
1372 o[len] = 0;
1373
1374 /* Look up the user name. */
67c08d6c 1375 BLOCK_INPUT;
4887597a 1376 pw = (struct passwd *) getpwnam (o + 1);
67c08d6c 1377 UNBLOCK_INPUT;
4887597a
EZ
1378 if (!pw)
1379 error ("\"%s\" isn't a registered user", o + 1);
1380
1381 newdir = (unsigned char *) pw->pw_dir;
1382
1383 /* Discard the user name from NM. */
1384 nm += len;
1385 }
1386
7c2fb837 1387 if (nm[0] != '/' && !newdir)
4887597a
EZ
1388 {
1389 if (NILP (defalt))
1390 defalt = current_buffer->directory;
b7826503 1391 CHECK_STRING (defalt);
d5db4077 1392 newdir = SDATA (defalt);
4887597a
EZ
1393 }
1394
1395 /* Now concatenate the directory and name to new space in the stack frame */
1396
1397 tlen = (newdir ? strlen (newdir) + 1 : 0) + strlen (nm) + 1;
1398 target = (unsigned char *) alloca (tlen);
1399 *target = 0;
1400
1401 if (newdir)
1402 {
4887597a
EZ
1403 if (nm[0] == 0 || nm[0] == '/')
1404 strcpy (target, newdir);
1405 else
4887597a
EZ
1406 file_name_as_directory (target, newdir);
1407 }
1408
1409 strcat (target, nm);
4887597a
EZ
1410
1411 /* Now canonicalize by removing /. and /foo/.. if they appear */
1412
1413 p = target;
1414 o = target;
1415
1416 while (*p)
1417 {
4887597a
EZ
1418 if (*p != '/')
1419 {
1420 *o++ = *p++;
1421 }
1422 else if (!strncmp (p, "//", 2)
4887597a
EZ
1423 )
1424 {
1425 o = target;
1426 p++;
1427 }
994a7262
RS
1428 else if (p[0] == '/' && p[1] == '.'
1429 && (p[2] == '/' || p[2] == 0))
4887597a
EZ
1430 p += 2;
1431 else if (!strncmp (p, "/..", 3)
1432 /* `/../' is the "superroot" on certain file systems. */
1433 && o != target
1434 && (p[3] == '/' || p[3] == 0))
1435 {
1436 while (o != target && *--o != '/')
1437 ;
4887597a
EZ
1438 if (o == target && *o == '/')
1439 ++o;
1440 p += 3;
1441 }
1442 else
1443 {
1444 *o++ = *p++;
1445 }
4887597a
EZ
1446 }
1447
1448 return make_string (target, o - target);
1449}
1450#endif
570d7624 1451\f
c70a4df6
SM
1452/* If /~ or // appears, discard everything through first slash. */
1453static int
5976c3fe 1454file_name_absolute_p (const char *filename)
c70a4df6
SM
1455{
1456 return
1457 (IS_DIRECTORY_SEP (*filename) || *filename == '~'
c70a4df6
SM
1458#ifdef DOS_NT
1459 || (IS_DRIVE (*filename) && IS_DEVICE_SEP (filename[1])
1460 && IS_DIRECTORY_SEP (filename[2]))
1461#endif
1462 );
1463}
1464
5976c3fe
PE
1465static char *
1466search_embedded_absfilename (char *nm, char *endp)
c70a4df6 1467{
5976c3fe 1468 char *p, *s;
c70a4df6
SM
1469
1470 for (p = nm + 1; p < endp; p++)
1471 {
1472 if ((0
c70a4df6
SM
1473 || IS_DIRECTORY_SEP (p[-1]))
1474 && file_name_absolute_p (p)
e39a993c 1475#if defined (WINDOWSNT) || defined(CYGWIN)
c70a4df6
SM
1476 /* // at start of file name is meaningful in Apollo,
1477 WindowsNT and Cygwin systems. */
f34574c6 1478 && !(IS_DIRECTORY_SEP (p[0]) && p - 1 == nm)
e39a993c 1479#endif /* not (WINDOWSNT || CYGWIN) */
c70a4df6
SM
1480 )
1481 {
7c2fb837 1482 for (s = p; *s && (!IS_DIRECTORY_SEP (*s)); s++);
c70a4df6
SM
1483 if (p[0] == '~' && s > p + 1) /* we've got "/~something/" */
1484 {
5976c3fe 1485 char *o = alloca (s - p + 1);
c70a4df6 1486 struct passwd *pw;
72af86bd 1487 memcpy (o, p, s - p);
c70a4df6
SM
1488 o [s - p] = 0;
1489
1490 /* If we have ~user and `user' exists, discard
1491 everything up to ~. But if `user' does not exist, leave
1492 ~user alone, it might be a literal file name. */
67c08d6c
YM
1493 BLOCK_INPUT;
1494 pw = getpwnam (o + 1);
1495 UNBLOCK_INPUT;
1496 if (pw)
c70a4df6 1497 return p;
c70a4df6
SM
1498 }
1499 else
1500 return p;
1501 }
1502 }
1503 return NULL;
1504}
1505
a7ca3326 1506DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
8c1a1077
PJ
1507 Ssubstitute_in_file_name, 1, 1, 0,
1508 doc: /* Substitute environment variables referred to in FILENAME.
1509`$FOO' where FOO is an environment variable name means to substitute
1510the value of that variable. The variable name should be terminated
1511with a character not a letter, digit or underscore; otherwise, enclose
1512the entire variable name in braces.
c68845e0
GM
1513
1514If `/~' appears, all of FILENAME through that `/' is discarded.
1515If `//' appears, everything up to and including the first of
1516those `/' is discarded. */)
5842a27b 1517 (Lisp_Object filename)
570d7624 1518{
5976c3fe 1519 char *nm;
570d7624 1520
5976c3fe
PE
1521 register char *s, *p, *o, *x, *endp;
1522 char *target = NULL;
570d7624
JB
1523 int total = 0;
1524 int substituted = 0;
58aec0d6 1525 int multibyte;
5976c3fe 1526 char *xnm;
8ce069f5 1527 Lisp_Object handler;
570d7624 1528
b7826503 1529 CHECK_STRING (filename);
570d7624 1530
58aec0d6
JR
1531 multibyte = STRING_MULTIBYTE (filename);
1532
8ce069f5
RS
1533 /* If the file name has special constructs in it,
1534 call the corresponding file handler. */
3b7f6e60 1535 handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
8ce069f5 1536 if (!NILP (handler))
3b7f6e60 1537 return call2 (handler, Qsubstitute_in_file_name, filename);
8ce069f5 1538
58aec0d6
JR
1539 /* Always work on a copy of the string, in case GC happens during
1540 decode of environment variables, causing the original Lisp_String
1541 data to be relocated. */
5976c3fe 1542 nm = (char *) alloca (SBYTES (filename) + 1);
72af86bd 1543 memcpy (nm, SDATA (filename), SBYTES (filename) + 1);
0f3f018c 1544
58aec0d6 1545#ifdef DOS_NT
087fc47a 1546 dostounix_filename (nm);
d5db4077 1547 substituted = (strcmp (nm, SDATA (filename)) != 0);
a5a1cc06 1548#endif
d5db4077 1549 endp = nm + SBYTES (filename);
570d7624 1550
82330e7f 1551 /* If /~ or // appears, discard everything through first slash. */
c70a4df6
SM
1552 p = search_embedded_absfilename (nm, endp);
1553 if (p)
1554 /* Start over with the new string, so we check the file-name-handler
1555 again. Important with filenames like "/home/foo//:/hello///there"
1556 which whould substitute to "/:/hello///there" rather than "/there". */
1557 return Fsubstitute_in_file_name
58aec0d6 1558 (make_specified_string (p, -1, endp - p, multibyte));
570d7624
JB
1559
1560 /* See if any variables are substituted into the string
1561 and find the total length of their values in `total' */
1562
1563 for (p = nm; p != endp;)
1564 if (*p != '$')
1565 p++;
1566 else
1567 {
1568 p++;
1569 if (p == endp)
1570 goto badsubst;
1571 else if (*p == '$')
1572 {
1573 /* "$$" means a single "$" */
1574 p++;
1575 total -= 1;
1576 substituted = 1;
1577 continue;
1578 }
1579 else if (*p == '{')
1580 {
1581 o = ++p;
1582 while (p != endp && *p != '}') p++;
1583 if (*p != '}') goto missingclose;
1584 s = p;
1585 }
1586 else
1587 {
1588 o = p;
1589 while (p != endp && (isalnum (*p) || *p == '_')) p++;
1590 s = p;
1591 }
1592
1593 /* Copy out the variable name */
5976c3fe 1594 target = (char *) alloca (s - o + 1);
570d7624
JB
1595 strncpy (target, o, s - o);
1596 target[s - o] = 0;
5e570b75 1597#ifdef DOS_NT
4c3c22f3 1598 strupr (target); /* $home == $HOME etc. */
5e570b75 1599#endif /* DOS_NT */
570d7624
JB
1600
1601 /* Get variable value */
5976c3fe 1602 o = egetenv (target);
8d2ced53 1603 if (o)
58aec0d6
JR
1604 {
1605 /* Don't try to guess a maximum length - UTF8 can use up to
1606 four bytes per character. This code is unlikely to run
1607 in a situation that requires performance, so decoding the
1608 env variables twice should be acceptable. Note that
1609 decoding may cause a garbage collect. */
1610 Lisp_Object orig, decoded;
1611 orig = make_unibyte_string (o, strlen (o));
1612 decoded = DECODE_FILE (orig);
1613 total += SBYTES (decoded);
8d2ced53
SM
1614 substituted = 1;
1615 }
1616 else if (*p == '}')
1617 goto badvar;
570d7624
JB
1618 }
1619
1620 if (!substituted)
3b7f6e60 1621 return filename;
570d7624
JB
1622
1623 /* If substitution required, recopy the string and do it */
1624 /* Make space in stack frame for the new copy */
5976c3fe 1625 xnm = (char *) alloca (SBYTES (filename) + total + 1);
570d7624
JB
1626 x = xnm;
1627
1628 /* Copy the rest of the name through, replacing $ constructs with values */
1629 for (p = nm; *p;)
1630 if (*p != '$')
1631 *x++ = *p++;
1632 else
1633 {
1634 p++;
1635 if (p == endp)
1636 goto badsubst;
1637 else if (*p == '$')
1638 {
1639 *x++ = *p++;
1640 continue;
1641 }
1642 else if (*p == '{')
1643 {
1644 o = ++p;
1645 while (p != endp && *p != '}') p++;
1646 if (*p != '}') goto missingclose;
1647 s = p++;
1648 }
1649 else
1650 {
1651 o = p;
1652 while (p != endp && (isalnum (*p) || *p == '_')) p++;
1653 s = p;
1654 }
1655
1656 /* Copy out the variable name */
5976c3fe 1657 target = (char *) alloca (s - o + 1);
570d7624
JB
1658 strncpy (target, o, s - o);
1659 target[s - o] = 0;
5e570b75 1660#ifdef DOS_NT
4c3c22f3 1661 strupr (target); /* $home == $HOME etc. */
5e570b75 1662#endif /* DOS_NT */
570d7624
JB
1663
1664 /* Get variable value */
5976c3fe 1665 o = egetenv (target);
570d7624 1666 if (!o)
8d2ced53
SM
1667 {
1668 *x++ = '$';
1669 strcpy (x, target); x+= strlen (target);
1670 }
60d67b83
RS
1671 else
1672 {
58aec0d6 1673 Lisp_Object orig, decoded;
93f4cf88 1674 ptrdiff_t orig_length, decoded_length;
58aec0d6
JR
1675 orig_length = strlen (o);
1676 orig = make_unibyte_string (o, orig_length);
1677 decoded = DECODE_FILE (orig);
1678 decoded_length = SBYTES (decoded);
42a5b22f 1679 strncpy (x, SSDATA (decoded), decoded_length);
58aec0d6
JR
1680 x += decoded_length;
1681
1682 /* If environment variable needed decoding, return value
1683 needs to be multibyte. */
1684 if (decoded_length != orig_length
42a5b22f 1685 || strncmp (SSDATA (decoded), o, orig_length))
58aec0d6 1686 multibyte = 1;
60d67b83 1687 }
570d7624
JB
1688 }
1689
1690 *x = 0;
1691
82330e7f 1692 /* If /~ or // appears, discard everything through first slash. */
c70a4df6
SM
1693 while ((p = search_embedded_absfilename (xnm, x)))
1694 /* This time we do not start over because we've already expanded envvars
1695 and replaced $$ with $. Maybe we should start over as well, but we'd
1696 need to quote some $ to $$ first. */
1697 xnm = p;
570d7624 1698
58aec0d6 1699 return make_specified_string (xnm, -1, x - xnm, multibyte);
570d7624
JB
1700
1701 badsubst:
1702 error ("Bad format environment-variable substitution");
1703 missingclose:
1704 error ("Missing \"}\" in environment-variable substitution");
1705 badvar:
1706 error ("Substituting nonexistent environment variable \"%s\"", target);
1707
1708 /* NOTREACHED */
6bbd7a29 1709 return Qnil;
570d7624
JB
1710}
1711\f
067ffa38 1712/* A slightly faster and more convenient way to get
298b760e 1713 (directory-file-name (expand-file-name FOO)). */
067ffa38 1714
570d7624 1715Lisp_Object
971de7fb 1716expand_and_dir_to_file (Lisp_Object filename, Lisp_Object defdir)
570d7624 1717{
199607e4 1718 register Lisp_Object absname;
570d7624 1719
199607e4 1720 absname = Fexpand_file_name (filename, defdir);
7c2fb837 1721
199607e4 1722 /* Remove final slash, if any (unless this is the root dir).
570d7624 1723 stat behaves differently depending! */
d5db4077
KR
1724 if (SCHARS (absname) > 1
1725 && IS_DIRECTORY_SEP (SREF (absname, SBYTES (absname) - 1))
1726 && !IS_DEVICE_SEP (SREF (absname, SBYTES (absname)-2)))
ddc61f46 1727 /* We cannot take shortcuts; they might be wrong for magic file names. */
199607e4 1728 absname = Fdirectory_file_name (absname);
199607e4 1729 return absname;
570d7624
JB
1730}
1731\f
3ed15d97
RS
1732/* Signal an error if the file ABSNAME already exists.
1733 If INTERACTIVE is nonzero, ask the user whether to proceed,
1734 and bypass the error if the user says to go ahead.
1735 QUERYSTRING is a name for the action that is being considered
1736 to alter the file.
de1d0127 1737
3ed15d97 1738 *STATPTR is used to store the stat information if the file exists.
de1d0127 1739 If the file does not exist, STATPTR->st_mode is set to 0.
b8b29dc9
RS
1740 If STATPTR is null, we don't store into it.
1741
1742 If QUICK is nonzero, we ask for y or n, not yes or no. */
3ed15d97 1743
f14b7e14 1744static void
5976c3fe
PE
1745barf_or_query_if_file_exists (Lisp_Object absname, const char *querystring,
1746 int interactive, struct stat *statptr, int quick)
570d7624 1747{
643c73b9 1748 register Lisp_Object tem, encoded_filename;
4018b5ef 1749 struct stat statbuf;
570d7624
JB
1750 struct gcpro gcpro1;
1751
643c73b9
RS
1752 encoded_filename = ENCODE_FILE (absname);
1753
4018b5ef
RS
1754 /* stat is a good way to tell whether the file exists,
1755 regardless of what access permissions it has. */
42a5b22f 1756 if (lstat (SSDATA (encoded_filename), &statbuf) >= 0)
570d7624 1757 {
c4f2d8d4
LMI
1758 if (Ffile_directory_p (absname))
1759 xsignal2 (Qfile_error,
ad637907 1760 build_string ("File is a directory"), absname);
c4f2d8d4 1761
570d7624 1762 if (! interactive)
24b1ddad
KS
1763 xsignal2 (Qfile_already_exists,
1764 build_string ("File already exists"), absname);
570d7624 1765 GCPRO1 (absname);
67e8e2b8
RS
1766 tem = format2 ("File %s already exists; %s anyway? ",
1767 absname, build_string (querystring));
b8b29dc9 1768 if (quick)
5616cc54 1769 tem = call1 (intern ("y-or-n-p"), tem);
b8b29dc9
RS
1770 else
1771 tem = do_yes_or_no_p (tem);
570d7624 1772 UNGCPRO;
265a9e55 1773 if (NILP (tem))
24b1ddad
KS
1774 xsignal2 (Qfile_already_exists,
1775 build_string ("File already exists"), absname);
3ed15d97
RS
1776 if (statptr)
1777 *statptr = statbuf;
1778 }
1779 else
1780 {
1781 if (statptr)
1782 statptr->st_mode = 0;
570d7624
JB
1783 }
1784 return;
1785}
1786
574c05e2 1787DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 6,
7c0f6118 1788 "fCopy file: \nGCopy %s to file: \np\nP",
8c1a1077
PJ
1789 doc: /* Copy FILE to NEWNAME. Both args must be strings.
1790If NEWNAME names a directory, copy FILE there.
795c20df
CY
1791
1792This function always sets the file modes of the output file to match
1793the input file.
1794
1795The optional third argument OK-IF-ALREADY-EXISTS specifies what to do
1796if file NEWNAME already exists. If OK-IF-ALREADY-EXISTS is nil, we
1797signal a `file-already-exists' error without overwriting. If
1798OK-IF-ALREADY-EXISTS is a number, we request confirmation from the user
1799about overwriting; this is what happens in interactive use with M-x.
1800Any other value for OK-IF-ALREADY-EXISTS means to overwrite the
1801existing file.
c50f15d0 1802
7f08b80e 1803Fourth arg KEEP-TIME non-nil means give the output file the same
8c1a1077 1804last-modified time as the old one. (This works on only some systems.)
c50f15d0 1805
7fce7dfe
EZ
1806A prefix arg makes KEEP-TIME non-nil.
1807
586702ce 1808If PRESERVE-UID-GID is non-nil, we try to transfer the
574c05e2
KK
1809uid and gid of FILE to NEWNAME.
1810
f5783df3 1811If PRESERVE-SELINUX-CONTEXT is non-nil and SELinux is enabled
574c05e2 1812on the system, we copy the SELinux context of FILE to NEWNAME. */)
5842a27b 1813 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists, Lisp_Object keep_time, Lisp_Object preserve_uid_gid, Lisp_Object preserve_selinux_context)
570d7624 1814{
8a2cbd72
EZ
1815 int ifd, ofd;
1816 EMACS_INT n;
570d7624 1817 char buf[16 * 1024];
3ed15d97 1818 struct stat st, out_st;
32f4334d 1819 Lisp_Object handler;
b1d1b865 1820 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
aed13378 1821 int count = SPECPDL_INDEX ();
f73b0ada 1822 int input_file_statable_p;
b1d1b865 1823 Lisp_Object encoded_file, encoded_newname;
574c05e2
KK
1824#if HAVE_LIBSELINUX
1825 security_context_t con;
1826 int fail, conlength = 0;
1827#endif
570d7624 1828
b1d1b865
RS
1829 encoded_file = encoded_newname = Qnil;
1830 GCPRO4 (file, newname, encoded_file, encoded_newname);
b7826503
PJ
1831 CHECK_STRING (file);
1832 CHECK_STRING (newname);
b1d1b865 1833
a9d14e54 1834 if (!NILP (Ffile_directory_p (newname)))
6b61353c 1835 newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname);
a9d14e54
GM
1836 else
1837 newname = Fexpand_file_name (newname, Qnil);
1838
3b7f6e60 1839 file = Fexpand_file_name (file, Qnil);
32f4334d 1840
0bf2eed2 1841 /* If the input file name has special constructs in it,
32f4334d 1842 call the corresponding file handler. */
3b7f6e60 1843 handler = Ffind_file_name_handler (file, Qcopy_file);
0bf2eed2 1844 /* Likewise for output file name. */
51cf6d37 1845 if (NILP (handler))
49307295 1846 handler = Ffind_file_name_handler (newname, Qcopy_file);
32f4334d 1847 if (!NILP (handler))
574c05e2
KK
1848 RETURN_UNGCPRO (call7 (handler, Qcopy_file, file, newname,
1849 ok_if_already_exists, keep_time, preserve_uid_gid,
1850 preserve_selinux_context));
32f4334d 1851
b1d1b865
RS
1852 encoded_file = ENCODE_FILE (file);
1853 encoded_newname = ENCODE_FILE (newname);
1854
265a9e55 1855 if (NILP (ok_if_already_exists)
93c30b5f 1856 || INTEGERP (ok_if_already_exists))
2f868094 1857 barf_or_query_if_file_exists (newname, "copy to it",
b8b29dc9 1858 INTEGERP (ok_if_already_exists), &out_st, 0);
42a5b22f 1859 else if (stat (SSDATA (encoded_newname), &out_st) < 0)
3ed15d97 1860 out_st.st_mode = 0;
570d7624 1861
e8691c59 1862#ifdef WINDOWSNT
d5db4077 1863 if (!CopyFile (SDATA (encoded_file),
efdc16c9 1864 SDATA (encoded_newname),
e8691c59
GM
1865 FALSE))
1866 report_file_error ("Copying file", Fcons (file, Fcons (newname, Qnil)));
8b53dc06
JR
1867 /* CopyFile retains the timestamp by default. */
1868 else if (NILP (keep_time))
e8691c59
GM
1869 {
1870 EMACS_TIME now;
ad497129
JR
1871 DWORD attributes;
1872 char * filename;
1873
e8691c59 1874 EMACS_GET_TIME (now);
d5db4077 1875 filename = SDATA (encoded_newname);
ad497129
JR
1876
1877 /* Ensure file is writable while its modified time is set. */
1878 attributes = GetFileAttributes (filename);
02cca86b 1879 SetFileAttributes (filename, attributes & ~FILE_ATTRIBUTE_READONLY);
ad497129
JR
1880 if (set_file_times (filename, now, now))
1881 {
1882 /* Restore original attributes. */
1883 SetFileAttributes (filename, attributes);
24b1ddad
KS
1884 xsignal2 (Qfile_date_error,
1885 build_string ("Cannot set file date"), newname);
ad497129
JR
1886 }
1887 /* Restore original attributes. */
1888 SetFileAttributes (filename, attributes);
e8691c59
GM
1889 }
1890#else /* not WINDOWSNT */
13336908 1891 immediate_quit = 1;
42a5b22f 1892 ifd = emacs_open (SSDATA (encoded_file), O_RDONLY, 0);
13336908
RS
1893 immediate_quit = 0;
1894
570d7624 1895 if (ifd < 0)
3b7f6e60 1896 report_file_error ("Opening input file", Fcons (file, Qnil));
570d7624 1897
b5148e85
RS
1898 record_unwind_protect (close_file_unwind, make_number (ifd));
1899
f73b0ada
BF
1900 /* We can only copy regular files and symbolic links. Other files are not
1901 copyable by us. */
1902 input_file_statable_p = (fstat (ifd, &st) >= 0);
1903
574c05e2
KK
1904#if HAVE_LIBSELINUX
1905 if (!NILP (preserve_selinux_context) && is_selinux_enabled ())
1906 {
1907 conlength = fgetfilecon (ifd, &con);
1908 if (conlength == -1)
1909 report_file_error ("Doing fgetfilecon", Fcons (file, Qnil));
1910 }
1911#endif
1912
3ed15d97
RS
1913 if (out_st.st_mode != 0
1914 && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
1915 {
1916 errno = 0;
1917 report_file_error ("Input and output files are the same",
3b7f6e60 1918 Fcons (file, Fcons (newname, Qnil)));
3ed15d97 1919 }
3ed15d97 1920
f73b0ada
BF
1921 if (input_file_statable_p)
1922 {
1923 if (!(S_ISREG (st.st_mode)) && !(S_ISLNK (st.st_mode)))
1924 {
1925#if defined (EISDIR)
1926 /* Get a better looking error message. */
1927 errno = EISDIR;
1928#endif /* EISDIR */
3b7f6e60 1929 report_file_error ("Non-regular file", Fcons (file, Qnil));
f73b0ada
BF
1930 }
1931 }
f73b0ada 1932
4c3c22f3
RS
1933#ifdef MSDOS
1934 /* System's default file type was set to binary by _fmode in emacs.c. */
c50f15d0 1935 ofd = emacs_open (SDATA (encoded_newname),
7fce7dfe 1936 O_WRONLY | O_TRUNC | O_CREAT
795c20df 1937 | (NILP (ok_if_already_exists) ? O_EXCL : 0),
c50f15d0
RS
1938 S_IREAD | S_IWRITE);
1939#else /* not MSDOS */
42a5b22f 1940 ofd = emacs_open (SSDATA (encoded_newname),
c50f15d0 1941 O_WRONLY | O_TRUNC | O_CREAT
795c20df 1942 | (NILP (ok_if_already_exists) ? O_EXCL : 0),
c50f15d0 1943 0666);
4c3c22f3 1944#endif /* not MSDOS */
570d7624 1945 if (ofd < 0)
3ed15d97 1946 report_file_error ("Opening output file", Fcons (newname, Qnil));
b5148e85
RS
1947
1948 record_unwind_protect (close_file_unwind, make_number (ofd));
570d7624 1949
b5148e85
RS
1950 immediate_quit = 1;
1951 QUIT;
68c45bf0
PE
1952 while ((n = emacs_read (ifd, buf, sizeof buf)) > 0)
1953 if (emacs_write (ofd, buf, n) != n)
3ed15d97 1954 report_file_error ("I/O error", Fcons (newname, Qnil));
b5148e85 1955 immediate_quit = 0;
570d7624 1956
b016179b
EZ
1957#ifndef MSDOS
1958 /* Preserve the original file modes, and if requested, also its
1959 owner and group. */
586702ce
RS
1960 if (input_file_statable_p)
1961 {
81e56e61
PE
1962 if (!NILP (preserve_uid_gid) && fchown (ofd, st.st_uid, st.st_gid) != 0)
1963 report_file_error ("Doing chown", Fcons (newname, Qnil));
1964 if (fchmod (ofd, st.st_mode & 07777) != 0)
1965 report_file_error ("Doing chmod", Fcons (newname, Qnil));
586702ce 1966 }
b016179b 1967#endif /* not MSDOS */
586702ce 1968
574c05e2
KK
1969#if HAVE_LIBSELINUX
1970 if (conlength > 0)
1971 {
1972 /* Set the modified context back to the file. */
1973 fail = fsetfilecon (ofd, con);
1974 if (fail)
1975 report_file_error ("Doing fsetfilecon", Fcons (newname, Qnil));
1976
1977 freecon (con);
1978 }
1979#endif
1980
5acac34e 1981 /* Closing the output clobbers the file times on some systems. */
68c45bf0 1982 if (emacs_close (ofd) < 0)
5acac34e
RS
1983 report_file_error ("I/O error", Fcons (newname, Qnil));
1984
f73b0ada 1985 if (input_file_statable_p)
570d7624 1986 {
8ca6602c 1987 if (!NILP (keep_time))
570d7624 1988 {
de5bf5d3
JB
1989 EMACS_TIME atime, mtime;
1990 EMACS_SET_SECS_USECS (atime, st.st_atime, 0);
1991 EMACS_SET_SECS_USECS (mtime, st.st_mtime, 0);
42a5b22f 1992 if (set_file_times (SSDATA (encoded_newname),
b1d1b865 1993 atime, mtime))
24b1ddad
KS
1994 xsignal2 (Qfile_date_error,
1995 build_string ("Cannot set file date"), newname);
570d7624 1996 }
570d7624
JB
1997 }
1998
68c45bf0 1999 emacs_close (ifd);
b016179b 2000
ed68db4d 2001#ifdef MSDOS
b016179b
EZ
2002 if (input_file_statable_p)
2003 {
2004 /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
2005 and if it can't, it tells so. Otherwise, under MSDOS we usually
2006 get only the READ bit, which will make the copied file read-only,
2007 so it's better not to chmod at all. */
2008 if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
2009 chmod (SDATA (encoded_newname), st.st_mode & 07777);
2010 }
ed68db4d 2011#endif /* MSDOS */
b016179b 2012#endif /* not WINDOWSNT */
5acac34e 2013
b5148e85
RS
2014 /* Discard the unwind protects. */
2015 specpdl_ptr = specpdl + count;
2016
570d7624
JB
2017 UNGCPRO;
2018 return Qnil;
2019}
385b6cc7 2020\f
9bbe01fb 2021DEFUN ("make-directory-internal", Fmake_directory_internal,
353cfc19 2022 Smake_directory_internal, 1, 1, 0,
8c1a1077 2023 doc: /* Create a new directory named DIRECTORY. */)
5842a27b 2024 (Lisp_Object directory)
570d7624 2025{
5976c3fe 2026 const char *dir;
32f4334d 2027 Lisp_Object handler;
b1d1b865 2028 Lisp_Object encoded_dir;
570d7624 2029
b7826503 2030 CHECK_STRING (directory);
3b7f6e60 2031 directory = Fexpand_file_name (directory, Qnil);
32f4334d 2032
3b7f6e60 2033 handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
32f4334d 2034 if (!NILP (handler))
3b7f6e60 2035 return call2 (handler, Qmake_directory_internal, directory);
9bbe01fb 2036
b1d1b865
RS
2037 encoded_dir = ENCODE_FILE (directory);
2038
5976c3fe 2039 dir = SSDATA (encoded_dir);
570d7624 2040
5e570b75
RS
2041#ifdef WINDOWSNT
2042 if (mkdir (dir) != 0)
2043#else
570d7624 2044 if (mkdir (dir, 0777) != 0)
5e570b75 2045#endif
a9f2aeae 2046 report_file_error ("Creating directory", list1 (directory));
570d7624 2047
32f4334d 2048 return Qnil;
570d7624
JB
2049}
2050
9d8f3bd9
MA
2051DEFUN ("delete-directory-internal", Fdelete_directory_internal,
2052 Sdelete_directory_internal, 1, 1, 0,
efdc16c9 2053 doc: /* Delete the directory named DIRECTORY. Does not follow symlinks. */)
5842a27b 2054 (Lisp_Object directory)
570d7624 2055{
5976c3fe 2056 const char *dir;
b1d1b865 2057 Lisp_Object encoded_dir;
570d7624 2058
b7826503 2059 CHECK_STRING (directory);
3b7f6e60 2060 directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil));
b1d1b865 2061 encoded_dir = ENCODE_FILE (directory);
5976c3fe 2062 dir = SSDATA (encoded_dir);
b1d1b865 2063
570d7624 2064 if (rmdir (dir) != 0)
a9f2aeae 2065 report_file_error ("Removing directory", list1 (directory));
570d7624
JB
2066
2067 return Qnil;
2068}
2069
2e2bbddb 2070DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 2,
f1a5d776
CY
2071 "(list (read-file-name \
2072 (if (and delete-by-moving-to-trash (null current-prefix-arg)) \
2073 \"Move file to trash: \" \"Delete file: \") \
2074 nil default-directory (confirm-nonexistent-file-or-buffer)) \
2075 (null current-prefix-arg))",
efdc16c9 2076 doc: /* Delete file named FILENAME. If it is a symlink, remove the symlink.
53967e09 2077If file has multiple names, it continues to exist with the other names.
f1a5d776
CY
2078TRASH non-nil means to trash the file instead of deleting, provided
2079`delete-by-moving-to-trash' is non-nil.
53967e09 2080
f1a5d776
CY
2081When called interactively, TRASH is t if no prefix argument is given.
2082With a prefix argument, TRASH is nil. */)
5842a27b 2083 (Lisp_Object filename, Lisp_Object trash)
570d7624 2084{
32f4334d 2085 Lisp_Object handler;
b1d1b865 2086 Lisp_Object encoded_file;
efdc16c9 2087 struct gcpro gcpro1;
b1d1b865 2088
efdc16c9 2089 GCPRO1 (filename);
b4bd27c5
RS
2090 if (!NILP (Ffile_directory_p (filename))
2091 && NILP (Ffile_symlink_p (filename)))
24b1ddad
KS
2092 xsignal2 (Qfile_error,
2093 build_string ("Removing old name: is a directory"),
2094 filename);
efdc16c9 2095 UNGCPRO;
570d7624 2096 filename = Fexpand_file_name (filename, Qnil);
32f4334d 2097
49307295 2098 handler = Ffind_file_name_handler (filename, Qdelete_file);
32f4334d 2099 if (!NILP (handler))
f5783df3 2100 return call3 (handler, Qdelete_file, filename, trash);
32f4334d 2101
f1a5d776 2102 if (delete_by_moving_to_trash && !NILP (trash))
6cf29fe8
JR
2103 return call1 (Qmove_file_to_trash, filename);
2104
b1d1b865
RS
2105 encoded_file = ENCODE_FILE (filename);
2106
42a5b22f 2107 if (0 > unlink (SSDATA (encoded_file)))
a9f2aeae 2108 report_file_error ("Removing old name", list1 (filename));
8a9b0da9 2109 return Qnil;
570d7624
JB
2110}
2111
385b6cc7 2112static Lisp_Object
971de7fb 2113internal_delete_file_1 (Lisp_Object ignore)
385b6cc7
RS
2114{
2115 return Qt;
2116}
2117
53967e09 2118/* Delete file FILENAME, returning 1 if successful and 0 if failed.
f1a5d776 2119 This ignores `delete-by-moving-to-trash'. */
385b6cc7
RS
2120
2121int
f1a5d776 2122internal_delete_file (Lisp_Object filename)
385b6cc7 2123{
a3911e8c 2124 Lisp_Object tem;
53967e09 2125
f1a5d776 2126 tem = internal_condition_case_2 (Fdelete_file, filename, Qnil,
a3911e8c
KR
2127 Qt, internal_delete_file_1);
2128 return NILP (tem);
385b6cc7
RS
2129}
2130\f
570d7624 2131DEFUN ("rename-file", Frename_file, Srename_file, 2, 3,
7c0f6118 2132 "fRename file: \nGRename %s to file: \np",
a4e03fe5 2133 doc: /* Rename FILE as NEWNAME. Both args must be strings.
8c1a1077
PJ
2134If file has names other than FILE, it continues to have those names.
2135Signals a `file-already-exists' error if a file NEWNAME already exists
2136unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2137A number as third arg means request confirmation if NEWNAME already exists.
2138This is what happens in interactive use with M-x. */)
5842a27b 2139 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
570d7624 2140{
32f4334d 2141 Lisp_Object handler;
f72b5416
JD
2142 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
2143 Lisp_Object encoded_file, encoded_newname, symlink_target;
570d7624 2144
f72b5416
JD
2145 symlink_target = encoded_file = encoded_newname = Qnil;
2146 GCPRO5 (file, newname, encoded_file, encoded_newname, symlink_target);
b7826503
PJ
2147 CHECK_STRING (file);
2148 CHECK_STRING (newname);
3b7f6e60 2149 file = Fexpand_file_name (file, Qnil);
1ffc5c90 2150
f83caf70
EZ
2151 if ((!NILP (Ffile_directory_p (newname)))
2152#ifdef DOS_NT
2153 /* If the file names are identical but for the case,
2154 don't attempt to move directory to itself. */
2155 && (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2156#endif
2157 )
8719abec
CY
2158 {
2159 Lisp_Object fname = NILP (Ffile_directory_p (file))
2160 ? file : Fdirectory_file_name (file);
2161 newname = Fexpand_file_name (Ffile_name_nondirectory (fname), newname);
2162 }
1ffc5c90
RS
2163 else
2164 newname = Fexpand_file_name (newname, Qnil);
32f4334d
RS
2165
2166 /* If the file name has special constructs in it,
2167 call the corresponding file handler. */
3b7f6e60 2168 handler = Ffind_file_name_handler (file, Qrename_file);
51cf6d37 2169 if (NILP (handler))
49307295 2170 handler = Ffind_file_name_handler (newname, Qrename_file);
32f4334d 2171 if (!NILP (handler))
36712b0a 2172 RETURN_UNGCPRO (call4 (handler, Qrename_file,
3b7f6e60 2173 file, newname, ok_if_already_exists));
32f4334d 2174
b1d1b865
RS
2175 encoded_file = ENCODE_FILE (file);
2176 encoded_newname = ENCODE_FILE (newname);
2177
bc77278f
EZ
2178#ifdef DOS_NT
2179 /* If the file names are identical but for the case, don't ask for
2180 confirmation: they simply want to change the letter-case of the
2181 file name. */
2182 if (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2183#endif
265a9e55 2184 if (NILP (ok_if_already_exists)
93c30b5f 2185 || INTEGERP (ok_if_already_exists))
2f868094 2186 barf_or_query_if_file_exists (newname, "rename to it",
b8b29dc9 2187 INTEGERP (ok_if_already_exists), 0, 0);
42a5b22f 2188 if (0 > rename (SSDATA (encoded_file), SSDATA (encoded_newname)))
570d7624
JB
2189 {
2190 if (errno == EXDEV)
2191 {
6bddfc97 2192 int count;
f72b5416 2193 symlink_target = Ffile_symlink_p (file);
440c7d00
JD
2194 if (! NILP (symlink_target))
2195 Fmake_symbolic_link (symlink_target, newname,
f59abab9 2196 NILP (ok_if_already_exists) ? Qnil : Qt);
ae0d7250 2197 else if (!NILP (Ffile_directory_p (file)))
8719abec
CY
2198 call4 (Qcopy_directory, file, newname, Qt, Qnil);
2199 else
2200 /* We have already prompted if it was an integer, so don't
2201 have copy-file prompt again. */
586702ce 2202 Fcopy_file (file, newname,
586702ce 2203 NILP (ok_if_already_exists) ? Qnil : Qt,
574c05e2 2204 Qt, Qt, Qt);
d550c425 2205
6bddfc97 2206 count = SPECPDL_INDEX ();
d2b66acf 2207 specbind (Qdelete_by_moving_to_trash, Qnil);
8fab2362 2208
ae0d7250 2209 if (!NILP (Ffile_directory_p (file)) && NILP (symlink_target))
8719abec
CY
2210 call2 (Qdelete_directory, file, Qt);
2211 else
f1a5d776 2212 Fdelete_file (file, Qnil);
6bddfc97 2213 unbind_to (count, Qnil);
570d7624
JB
2214 }
2215 else
a9f2aeae 2216 report_file_error ("Renaming", list2 (file, newname));
570d7624
JB
2217 }
2218 UNGCPRO;
2219 return Qnil;
2220}
2221
2222DEFUN ("add-name-to-file", Fadd_name_to_file, Sadd_name_to_file, 2, 3,
7c0f6118 2223 "fAdd name to file: \nGName to add to %s: \np",
a4e03fe5 2224 doc: /* Give FILE additional name NEWNAME. Both args must be strings.
8c1a1077
PJ
2225Signals a `file-already-exists' error if a file NEWNAME already exists
2226unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2227A number as third arg means request confirmation if NEWNAME already exists.
2228This is what happens in interactive use with M-x. */)
5842a27b 2229 (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
570d7624 2230{
32f4334d 2231 Lisp_Object handler;
b1d1b865
RS
2232 Lisp_Object encoded_file, encoded_newname;
2233 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
570d7624 2234
b1d1b865
RS
2235 GCPRO4 (file, newname, encoded_file, encoded_newname);
2236 encoded_file = encoded_newname = Qnil;
b7826503
PJ
2237 CHECK_STRING (file);
2238 CHECK_STRING (newname);
3b7f6e60 2239 file = Fexpand_file_name (file, Qnil);
1ffc5c90
RS
2240
2241 if (!NILP (Ffile_directory_p (newname)))
2242 newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname);
2243 else
2244 newname = Fexpand_file_name (newname, Qnil);
32f4334d
RS
2245
2246 /* If the file name has special constructs in it,
2247 call the corresponding file handler. */
3b7f6e60 2248 handler = Ffind_file_name_handler (file, Qadd_name_to_file);
32f4334d 2249 if (!NILP (handler))
3b7f6e60 2250 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
36712b0a 2251 newname, ok_if_already_exists));
32f4334d 2252
adc6741c
RS
2253 /* If the new name has special constructs in it,
2254 call the corresponding file handler. */
2255 handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
2256 if (!NILP (handler))
3b7f6e60 2257 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
adc6741c
RS
2258 newname, ok_if_already_exists));
2259
b1d1b865
RS
2260 encoded_file = ENCODE_FILE (file);
2261 encoded_newname = ENCODE_FILE (newname);
2262
265a9e55 2263 if (NILP (ok_if_already_exists)
93c30b5f 2264 || INTEGERP (ok_if_already_exists))
2f868094 2265 barf_or_query_if_file_exists (newname, "make it a new name",
b8b29dc9 2266 INTEGERP (ok_if_already_exists), 0, 0);
5e570b75 2267
42a5b22f
PE
2268 unlink (SSDATA (newname));
2269 if (0 > link (SSDATA (encoded_file), SSDATA (encoded_newname)))
a9f2aeae 2270 report_file_error ("Adding new name", list2 (file, newname));
570d7624
JB
2271
2272 UNGCPRO;
2273 return Qnil;
2274}
2275
570d7624 2276DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3,
7c0f6118 2277 "FMake symbolic link to file: \nGMake symbolic link to file %s: \np",
68780e2a
RS
2278 doc: /* Make a symbolic link to FILENAME, named LINKNAME.
2279Both args must be strings.
8c1a1077
PJ
2280Signals a `file-already-exists' error if a file LINKNAME already exists
2281unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2282A number as third arg means request confirmation if LINKNAME already exists.
2283This happens for interactive use with M-x. */)
5842a27b 2284 (Lisp_Object filename, Lisp_Object linkname, Lisp_Object ok_if_already_exists)
570d7624 2285{
32f4334d 2286 Lisp_Object handler;
b1d1b865
RS
2287 Lisp_Object encoded_filename, encoded_linkname;
2288 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
570d7624 2289
b1d1b865
RS
2290 GCPRO4 (filename, linkname, encoded_filename, encoded_linkname);
2291 encoded_filename = encoded_linkname = Qnil;
b7826503
PJ
2292 CHECK_STRING (filename);
2293 CHECK_STRING (linkname);
d9bc1c99
RS
2294 /* If the link target has a ~, we must expand it to get
2295 a truly valid file name. Otherwise, do not expand;
2296 we want to permit links to relative file names. */
d5db4077 2297 if (SREF (filename, 0) == '~')
d9bc1c99 2298 filename = Fexpand_file_name (filename, Qnil);
1ffc5c90
RS
2299
2300 if (!NILP (Ffile_directory_p (linkname)))
dac24db4 2301 linkname = Fexpand_file_name (Ffile_name_nondirectory (filename), linkname);
1ffc5c90
RS
2302 else
2303 linkname = Fexpand_file_name (linkname, Qnil);
32f4334d
RS
2304
2305 /* If the file name has special constructs in it,
2306 call the corresponding file handler. */
49307295 2307 handler = Ffind_file_name_handler (filename, Qmake_symbolic_link);
32f4334d 2308 if (!NILP (handler))
36712b0a
KH
2309 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2310 linkname, ok_if_already_exists));
32f4334d 2311
adc6741c
RS
2312 /* If the new link name has special constructs in it,
2313 call the corresponding file handler. */
2314 handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
2315 if (!NILP (handler))
2316 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2317 linkname, ok_if_already_exists));
2318
b1d1b865
RS
2319 encoded_filename = ENCODE_FILE (filename);
2320 encoded_linkname = ENCODE_FILE (linkname);
2321
265a9e55 2322 if (NILP (ok_if_already_exists)
93c30b5f 2323 || INTEGERP (ok_if_already_exists))
2f868094 2324 barf_or_query_if_file_exists (linkname, "make it a link",
b8b29dc9 2325 INTEGERP (ok_if_already_exists), 0, 0);
42a5b22f
PE
2326 if (0 > symlink (SSDATA (encoded_filename),
2327 SSDATA (encoded_linkname)))
570d7624
JB
2328 {
2329 /* If we didn't complain already, silently delete existing file. */
2330 if (errno == EEXIST)
2331 {
42a5b22f
PE
2332 unlink (SSDATA (encoded_linkname));
2333 if (0 <= symlink (SSDATA (encoded_filename),
2334 SSDATA (encoded_linkname)))
1a04498e
KH
2335 {
2336 UNGCPRO;
2337 return Qnil;
2338 }
570d7624 2339 }
d9d0d182
PE
2340 if (errno == ENOSYS)
2341 {
2342 UNGCPRO;
2343 xsignal1 (Qfile_error,
2344 build_string ("Symbolic links are not supported"));
2345 }
570d7624 2346
a9f2aeae 2347 report_file_error ("Making symbolic link", list2 (filename, linkname));
570d7624
JB
2348 }
2349 UNGCPRO;
2350 return Qnil;
e89b536d 2351}
570d7624 2352
570d7624 2353\f
a7ca3326 2354DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
570d7624 2355 1, 1, 0,
8c1a1077
PJ
2356 doc: /* Return t if file FILENAME specifies an absolute file name.
2357On Unix, this is a name starting with a `/' or a `~'. */)
5842a27b 2358 (Lisp_Object filename)
570d7624 2359{
b7826503 2360 CHECK_STRING (filename);
5976c3fe 2361 return file_name_absolute_p (SSDATA (filename)) ? Qt : Qnil;
570d7624 2362}
3beeedfe
RS
2363\f
2364/* Return nonzero if file FILENAME exists and can be executed. */
2365
2366static int
971de7fb 2367check_executable (char *filename)
3beeedfe 2368{
3be3c08e 2369#ifdef DOS_NT
3be3c08e
RS
2370 struct stat st;
2371 if (stat (filename, &st) < 0)
2372 return 0;
199607e4 2373 return ((st.st_mode & S_IEXEC) != 0);
3be3c08e 2374#else /* not DOS_NT */
de0be7dd
RS
2375#ifdef HAVE_EUIDACCESS
2376 return (euidaccess (filename, 1) >= 0);
3beeedfe
RS
2377#else
2378 /* Access isn't quite right because it uses the real uid
2379 and we really want to test with the effective uid.
2380 But Unix doesn't give us a right way to do it. */
2381 return (access (filename, 1) >= 0);
2382#endif
3be3c08e 2383#endif /* not DOS_NT */
3beeedfe
RS
2384}
2385
2386/* Return nonzero if file FILENAME exists and can be written. */
2387
2388static int
8ea90aa3 2389check_writable (const char *filename)
3beeedfe 2390{
3be3c08e
RS
2391#ifdef MSDOS
2392 struct stat st;
2393 if (stat (filename, &st) < 0)
2394 return 0;
f68c809d 2395 return (st.st_mode & S_IWRITE || S_ISDIR (st.st_mode));
3be3c08e 2396#else /* not MSDOS */
41f3fb38
KH
2397#ifdef HAVE_EUIDACCESS
2398 return (euidaccess (filename, 2) >= 0);
3beeedfe
RS
2399#else
2400 /* Access isn't quite right because it uses the real uid
2401 and we really want to test with the effective uid.
2402 But Unix doesn't give us a right way to do it.
2403 Opening with O_WRONLY could work for an ordinary file,
2404 but would lose for directories. */
2405 return (access (filename, 2) >= 0);
2406#endif
3be3c08e 2407#endif /* not MSDOS */
3beeedfe 2408}
570d7624 2409
a7ca3326 2410DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
68780e2a
RS
2411 doc: /* Return t if file FILENAME exists (whether or not you can read it.)
2412See also `file-readable-p' and `file-attributes'.
2413This returns nil for a symlink to a nonexistent file.
2414Use `file-symlink-p' to test for such links. */)
5842a27b 2415 (Lisp_Object filename)
570d7624 2416{
199607e4 2417 Lisp_Object absname;
32f4334d 2418 Lisp_Object handler;
4018b5ef 2419 struct stat statbuf;
570d7624 2420
b7826503 2421 CHECK_STRING (filename);
199607e4 2422 absname = Fexpand_file_name (filename, Qnil);
32f4334d
RS
2423
2424 /* If the file name has special constructs in it,
2425 call the corresponding file handler. */
199607e4 2426 handler = Ffind_file_name_handler (absname, Qfile_exists_p);
32f4334d 2427 if (!NILP (handler))
199607e4 2428 return call2 (handler, Qfile_exists_p, absname);
32f4334d 2429
b1d1b865
RS
2430 absname = ENCODE_FILE (absname);
2431
42a5b22f 2432 return (stat (SSDATA (absname), &statbuf) >= 0) ? Qt : Qnil;
570d7624
JB
2433}
2434
2435DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0,
8c1a1077
PJ
2436 doc: /* Return t if FILENAME can be executed by you.
2437For a directory, this means you can access files in that directory. */)
5842a27b 2438 (Lisp_Object filename)
570d7624 2439{
199607e4 2440 Lisp_Object absname;
32f4334d 2441 Lisp_Object handler;
570d7624 2442
b7826503 2443 CHECK_STRING (filename);
199607e4 2444 absname = Fexpand_file_name (filename, Qnil);
32f4334d
RS
2445
2446 /* If the file name has special constructs in it,
2447 call the corresponding file handler. */
199607e4 2448 handler = Ffind_file_name_handler (absname, Qfile_executable_p);
32f4334d 2449 if (!NILP (handler))
199607e4 2450 return call2 (handler, Qfile_executable_p, absname);
32f4334d 2451
b1d1b865
RS
2452 absname = ENCODE_FILE (absname);
2453
42a5b22f 2454 return (check_executable (SSDATA (absname)) ? Qt : Qnil);
570d7624
JB
2455}
2456
a7ca3326 2457DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0,
8c1a1077
PJ
2458 doc: /* Return t if file FILENAME exists and you can read it.
2459See also `file-exists-p' and `file-attributes'. */)
5842a27b 2460 (Lisp_Object filename)
570d7624 2461{
199607e4 2462 Lisp_Object absname;
32f4334d 2463 Lisp_Object handler;
4018b5ef 2464 int desc;
bb369dc6
RS
2465 int flags;
2466 struct stat statbuf;
570d7624 2467
b7826503 2468 CHECK_STRING (filename);
199607e4 2469 absname = Fexpand_file_name (filename, Qnil);
32f4334d
RS
2470
2471 /* If the file name has special constructs in it,
2472 call the corresponding file handler. */
199607e4 2473 handler = Ffind_file_name_handler (absname, Qfile_readable_p);
32f4334d 2474 if (!NILP (handler))
199607e4 2475 return call2 (handler, Qfile_readable_p, absname);
32f4334d 2476
b1d1b865
RS
2477 absname = ENCODE_FILE (absname);
2478
fb4c6c96
AC
2479#if defined(DOS_NT) || defined(macintosh)
2480 /* Under MS-DOS, Windows, and Macintosh, open does not work for
2481 directories. */
d5db4077 2482 if (access (SDATA (absname), 0) == 0)
a8a7d065
RS
2483 return Qt;
2484 return Qnil;
fb4c6c96 2485#else /* not DOS_NT and not macintosh */
bb369dc6 2486 flags = O_RDONLY;
ae0d7250 2487#ifdef O_NONBLOCK
bb369dc6
RS
2488 /* Opening a fifo without O_NONBLOCK can wait.
2489 We don't want to wait. But we don't want to mess wth O_NONBLOCK
2490 except in the case of a fifo, on a system which handles it. */
42a5b22f 2491 desc = stat (SSDATA (absname), &statbuf);
bb369dc6
RS
2492 if (desc < 0)
2493 return Qnil;
2494 if (S_ISFIFO (statbuf.st_mode))
2495 flags |= O_NONBLOCK;
2496#endif
42a5b22f 2497 desc = emacs_open (SSDATA (absname), flags, 0);
4018b5ef
RS
2498 if (desc < 0)
2499 return Qnil;
68c45bf0 2500 emacs_close (desc);
4018b5ef 2501 return Qt;
fb4c6c96 2502#endif /* not DOS_NT and not macintosh */
570d7624
JB
2503}
2504
f793dc6c
RS
2505/* Having this before file-symlink-p mysteriously caused it to be forgotten
2506 on the RT/PC. */
2507DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
8c1a1077 2508 doc: /* Return t if file FILENAME can be written or created by you. */)
5842a27b 2509 (Lisp_Object filename)
f793dc6c 2510{
b1d1b865 2511 Lisp_Object absname, dir, encoded;
f793dc6c
RS
2512 Lisp_Object handler;
2513 struct stat statbuf;
2514
b7826503 2515 CHECK_STRING (filename);
199607e4 2516 absname = Fexpand_file_name (filename, Qnil);
f793dc6c
RS
2517
2518 /* If the file name has special constructs in it,
2519 call the corresponding file handler. */
199607e4 2520 handler = Ffind_file_name_handler (absname, Qfile_writable_p);
f793dc6c 2521 if (!NILP (handler))
199607e4 2522 return call2 (handler, Qfile_writable_p, absname);
f793dc6c 2523
b1d1b865 2524 encoded = ENCODE_FILE (absname);
42a5b22f
PE
2525 if (stat (SSDATA (encoded), &statbuf) >= 0)
2526 return (check_writable (SSDATA (encoded))
f793dc6c 2527 ? Qt : Qnil);
b1d1b865 2528
199607e4 2529 dir = Ffile_name_directory (absname);
f793dc6c
RS
2530#ifdef MSDOS
2531 if (!NILP (dir))
2532 dir = Fdirectory_file_name (dir);
2533#endif /* MSDOS */
b1d1b865
RS
2534
2535 dir = ENCODE_FILE (dir);
e3e8a75a
GM
2536#ifdef WINDOWSNT
2537 /* The read-only attribute of the parent directory doesn't affect
2538 whether a file or directory can be created within it. Some day we
2539 should check ACLs though, which do affect this. */
d5db4077 2540 if (stat (SDATA (dir), &statbuf) < 0)
e3e8a75a 2541 return Qnil;
f68c809d 2542 return S_ISDIR (statbuf.st_mode) ? Qt : Qnil;
e3e8a75a 2543#else
51b59d79 2544 return (check_writable (!NILP (dir) ? SSDATA (dir) : "")
f793dc6c 2545 ? Qt : Qnil);
e3e8a75a 2546#endif
f793dc6c
RS
2547}
2548\f
1f8653eb 2549DEFUN ("access-file", Faccess_file, Saccess_file, 2, 2, 0,
8c1a1077
PJ
2550 doc: /* Access file FILENAME, and get an error if that does not work.
2551The second argument STRING is used in the error message.
a4e03fe5 2552If there is no error, returns nil. */)
5842a27b 2553 (Lisp_Object filename, Lisp_Object string)
1f8653eb 2554{
49475635 2555 Lisp_Object handler, encoded_filename, absname;
1f8653eb
RS
2556 int fd;
2557
b7826503 2558 CHECK_STRING (filename);
49475635
EZ
2559 absname = Fexpand_file_name (filename, Qnil);
2560
b7826503 2561 CHECK_STRING (string);
1f8653eb
RS
2562
2563 /* If the file name has special constructs in it,
2564 call the corresponding file handler. */
49475635 2565 handler = Ffind_file_name_handler (absname, Qaccess_file);
1f8653eb 2566 if (!NILP (handler))
49475635 2567 return call3 (handler, Qaccess_file, absname, string);
1f8653eb 2568
49475635 2569 encoded_filename = ENCODE_FILE (absname);
b1d1b865 2570
42a5b22f 2571 fd = emacs_open (SSDATA (encoded_filename), O_RDONLY, 0);
1f8653eb 2572 if (fd < 0)
42a5b22f 2573 report_file_error (SSDATA (string), Fcons (filename, Qnil));
68c45bf0 2574 emacs_close (fd);
1f8653eb
RS
2575
2576 return Qnil;
2577}
2578\f
a7ca3326 2579DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0,
8c1a1077 2580 doc: /* Return non-nil if file FILENAME is the name of a symbolic link.
1c353c74 2581The value is the link target, as a string.
68780e2a
RS
2582Otherwise it returns nil.
2583
2584This function returns t when given the name of a symlink that
2585points to a nonexistent file. */)
5842a27b 2586 (Lisp_Object filename)
570d7624 2587{
32f4334d 2588 Lisp_Object handler;
ae0d7250 2589 char *buf;
ae0d7250 2590 Lisp_Object val;
d1fdcab7 2591 char readlink_buf[READLINK_BUFSIZE];
570d7624 2592
b7826503 2593 CHECK_STRING (filename);
570d7624
JB
2594 filename = Fexpand_file_name (filename, Qnil);
2595
32f4334d
RS
2596 /* If the file name has special constructs in it,
2597 call the corresponding file handler. */
49307295 2598 handler = Ffind_file_name_handler (filename, Qfile_symlink_p);
32f4334d
RS
2599 if (!NILP (handler))
2600 return call2 (handler, Qfile_symlink_p, filename);
2601
b1d1b865
RS
2602 filename = ENCODE_FILE (filename);
2603
d1fdcab7
PE
2604 buf = emacs_readlink (SSDATA (filename), readlink_buf);
2605 if (! buf)
2606 return Qnil;
efdc16c9 2607
d1fdcab7 2608 val = build_string (buf);
8966b757 2609 if (buf[0] == '/' && strchr (buf, ':'))
69ac1891 2610 val = concat2 (build_string ("/:"), val);
d1fdcab7
PE
2611 if (buf != readlink_buf)
2612 xfree (buf);
cd913586
KH
2613 val = DECODE_FILE (val);
2614 return val;
570d7624
JB
2615}
2616
a7ca3326 2617DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0,
8c1a1077
PJ
2618 doc: /* Return t if FILENAME names an existing directory.
2619Symbolic links to directories count as directories.
2620See `file-symlink-p' to distinguish symlinks. */)
5842a27b 2621 (Lisp_Object filename)
570d7624 2622{
199607e4 2623 register Lisp_Object absname;
570d7624 2624 struct stat st;
32f4334d 2625 Lisp_Object handler;
570d7624 2626
4b4deea2 2627 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
570d7624 2628
32f4334d
RS
2629 /* If the file name has special constructs in it,
2630 call the corresponding file handler. */
199607e4 2631 handler = Ffind_file_name_handler (absname, Qfile_directory_p);
32f4334d 2632 if (!NILP (handler))
199607e4 2633 return call2 (handler, Qfile_directory_p, absname);
32f4334d 2634
b1d1b865
RS
2635 absname = ENCODE_FILE (absname);
2636
42a5b22f 2637 if (stat (SSDATA (absname), &st) < 0)
570d7624 2638 return Qnil;
f68c809d 2639 return S_ISDIR (st.st_mode) ? Qt : Qnil;
570d7624
JB
2640}
2641
a7ca3326 2642DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p,
16a97296 2643 Sfile_accessible_directory_p, 1, 1, 0,
e385ec41
RS
2644 doc: /* Return t if file FILENAME names a directory you can open.
2645For the value to be t, FILENAME must specify the name of a directory as a file,
2646and the directory must allow you to open files in it. In order to use a
8c1a1077
PJ
2647directory as a buffer's current directory, this predicate must return true.
2648A directory name spec may be given instead; then the value is t
2649if the directory so specified exists and really is a readable and
2650searchable directory. */)
5842a27b 2651 (Lisp_Object filename)
b72dea2a 2652{
32f4334d 2653 Lisp_Object handler;
1a04498e 2654 int tem;
d26859eb 2655 struct gcpro gcpro1;
32f4334d
RS
2656
2657 /* If the file name has special constructs in it,
2658 call the corresponding file handler. */
49307295 2659 handler = Ffind_file_name_handler (filename, Qfile_accessible_directory_p);
32f4334d
RS
2660 if (!NILP (handler))
2661 return call2 (handler, Qfile_accessible_directory_p, filename);
2662
d26859eb 2663 GCPRO1 (filename);
1a04498e
KH
2664 tem = (NILP (Ffile_directory_p (filename))
2665 || NILP (Ffile_executable_p (filename)));
d26859eb 2666 UNGCPRO;
1a04498e 2667 return tem ? Qnil : Qt;
b72dea2a
JB
2668}
2669
f793dc6c 2670DEFUN ("file-regular-p", Ffile_regular_p, Sfile_regular_p, 1, 1, 0,
19a9c3b7
LH
2671 doc: /* Return t if FILENAME names a regular file.
2672This is the sort of file that holds an ordinary stream of data bytes.
2673Symbolic links to regular files count as regular files.
2674See `file-symlink-p' to distinguish symlinks. */)
5842a27b 2675 (Lisp_Object filename)
f793dc6c 2676{
199607e4 2677 register Lisp_Object absname;
f793dc6c
RS
2678 struct stat st;
2679 Lisp_Object handler;
2680
4b4deea2 2681 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
f793dc6c
RS
2682
2683 /* If the file name has special constructs in it,
2684 call the corresponding file handler. */
199607e4 2685 handler = Ffind_file_name_handler (absname, Qfile_regular_p);
f793dc6c 2686 if (!NILP (handler))
199607e4 2687 return call2 (handler, Qfile_regular_p, absname);
f793dc6c 2688
b1d1b865
RS
2689 absname = ENCODE_FILE (absname);
2690
c1c4693e
RS
2691#ifdef WINDOWSNT
2692 {
2693 int result;
2694 Lisp_Object tem = Vw32_get_true_file_attributes;
2695
2696 /* Tell stat to use expensive method to get accurate info. */
2697 Vw32_get_true_file_attributes = Qt;
d5db4077 2698 result = stat (SDATA (absname), &st);
c1c4693e
RS
2699 Vw32_get_true_file_attributes = tem;
2700
2701 if (result < 0)
2702 return Qnil;
f68c809d 2703 return S_ISREG (st.st_mode) ? Qt : Qnil;
c1c4693e
RS
2704 }
2705#else
42a5b22f 2706 if (stat (SSDATA (absname), &st) < 0)
f793dc6c 2707 return Qnil;
f68c809d 2708 return S_ISREG (st.st_mode) ? Qt : Qnil;
c1c4693e 2709#endif
f793dc6c
RS
2710}
2711\f
574c05e2
KK
2712DEFUN ("file-selinux-context", Ffile_selinux_context,
2713 Sfile_selinux_context, 1, 1, 0,
2714 doc: /* Return SELinux context of file named FILENAME,
2715as a list ("user", "role", "type", "range"). Return (nil, nil, nil, nil)
2716if file does not exist, is not accessible, or SELinux is disabled */)
5842a27b 2717 (Lisp_Object filename)
574c05e2
KK
2718{
2719 Lisp_Object absname;
2720 Lisp_Object values[4];
2721 Lisp_Object handler;
2722#if HAVE_LIBSELINUX
2723 security_context_t con;
2724 int conlength;
2725 context_t context;
2726#endif
2727
4b4deea2 2728 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
574c05e2
KK
2729
2730 /* If the file name has special constructs in it,
2731 call the corresponding file handler. */
2732 handler = Ffind_file_name_handler (absname, Qfile_selinux_context);
2733 if (!NILP (handler))
2734 return call2 (handler, Qfile_selinux_context, absname);
2735
2736 absname = ENCODE_FILE (absname);
2737
2738 values[0] = Qnil;
2739 values[1] = Qnil;
2740 values[2] = Qnil;
2741 values[3] = Qnil;
2742#if HAVE_LIBSELINUX
2743 if (is_selinux_enabled ())
2744 {
b14aac08 2745 conlength = lgetfilecon (SSDATA (absname), &con);
574c05e2
KK
2746 if (conlength > 0)
2747 {
2748 context = context_new (con);
45841e65
KK
2749 if (context_user_get (context))
2750 values[0] = build_string (context_user_get (context));
2751 if (context_role_get (context))
2752 values[1] = build_string (context_role_get (context));
2753 if (context_type_get (context))
2754 values[2] = build_string (context_type_get (context));
2755 if (context_range_get (context))
2756 values[3] = build_string (context_range_get (context));
574c05e2
KK
2757 context_free (context);
2758 }
2759 if (con)
2760 freecon (con);
2761 }
2762#endif
2763
2764 return Flist (sizeof(values) / sizeof(values[0]), values);
2765}
2766\f
2767DEFUN ("set-file-selinux-context", Fset_file_selinux_context,
2768 Sset_file_selinux_context, 2, 2, 0,
2769 doc: /* Set SELinux context of file named FILENAME to CONTEXT
2770as a list ("user", "role", "type", "range"). Has no effect if SELinux
2771is disabled. */)
5842a27b 2772 (Lisp_Object filename, Lisp_Object context)
574c05e2 2773{
0f4a96b5 2774 Lisp_Object absname;
574c05e2 2775 Lisp_Object handler;
0f4a96b5
JB
2776#if HAVE_LIBSELINUX
2777 Lisp_Object encoded_absname;
574c05e2
KK
2778 Lisp_Object user = CAR_SAFE (context);
2779 Lisp_Object role = CAR_SAFE (CDR_SAFE (context));
2780 Lisp_Object type = CAR_SAFE (CDR_SAFE (CDR_SAFE (context)));
2781 Lisp_Object range = CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (context))));
574c05e2
KK
2782 security_context_t con;
2783 int fail, conlength;
2784 context_t parsed_con;
2785#endif
2786
4b4deea2 2787 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
574c05e2
KK
2788
2789 /* If the file name has special constructs in it,
2790 call the corresponding file handler. */
2791 handler = Ffind_file_name_handler (absname, Qset_file_selinux_context);
2792 if (!NILP (handler))
2793 return call3 (handler, Qset_file_selinux_context, absname, context);
2794
0f4a96b5 2795#if HAVE_LIBSELINUX
574c05e2
KK
2796 if (is_selinux_enabled ())
2797 {
2798 /* Get current file context. */
a9b53ad3 2799 encoded_absname = ENCODE_FILE (absname);
b14aac08 2800 conlength = lgetfilecon (SSDATA (encoded_absname), &con);
574c05e2
KK
2801 if (conlength > 0)
2802 {
2803 parsed_con = context_new (con);
2804 /* Change the parts defined in the parameter.*/
2805 if (STRINGP (user))
2806 {
b14aac08 2807 if (context_user_set (parsed_con, SSDATA (user)))
574c05e2
KK
2808 error ("Doing context_user_set");
2809 }
2810 if (STRINGP (role))
2811 {
b14aac08 2812 if (context_role_set (parsed_con, SSDATA (role)))
574c05e2
KK
2813 error ("Doing context_role_set");
2814 }
2815 if (STRINGP (type))
2816 {
b14aac08 2817 if (context_type_set (parsed_con, SSDATA (type)))
574c05e2
KK
2818 error ("Doing context_type_set");
2819 }
2820 if (STRINGP (range))
2821 {
b14aac08 2822 if (context_range_set (parsed_con, SSDATA (range)))
574c05e2
KK
2823 error ("Doing context_range_set");
2824 }
2825
2826 /* Set the modified context back to the file. */
b14aac08
PE
2827 fail = lsetfilecon (SSDATA (encoded_absname),
2828 context_str (parsed_con));
574c05e2
KK
2829 if (fail)
2830 report_file_error ("Doing lsetfilecon", Fcons (absname, Qnil));
2831
2832 context_free (parsed_con);
2833 }
2834 else
2835 report_file_error("Doing lgetfilecon", Fcons (absname, Qnil));
2836
2837 if (con)
2838 freecon (con);
2839 }
2840#endif
2841
2842 return Qnil;
2843}
2844\f
570d7624 2845DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
d4a42098
KS
2846 doc: /* Return mode bits of file named FILENAME, as an integer.
2847Return nil, if file does not exist or is not accessible. */)
5842a27b 2848 (Lisp_Object filename)
570d7624 2849{
199607e4 2850 Lisp_Object absname;
570d7624 2851 struct stat st;
32f4334d 2852 Lisp_Object handler;
570d7624 2853
4b4deea2 2854 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
570d7624 2855
32f4334d
RS
2856 /* If the file name has special constructs in it,
2857 call the corresponding file handler. */
199607e4 2858 handler = Ffind_file_name_handler (absname, Qfile_modes);
32f4334d 2859 if (!NILP (handler))
199607e4 2860 return call2 (handler, Qfile_modes, absname);
32f4334d 2861
b1d1b865
RS
2862 absname = ENCODE_FILE (absname);
2863
42a5b22f 2864 if (stat (SSDATA (absname), &st) < 0)
570d7624 2865 return Qnil;
3ace87e3 2866
570d7624
JB
2867 return make_number (st.st_mode & 07777);
2868}
2869
09fbdf6c
MC
2870DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2,
2871 "(let ((file (read-file-name \"File: \"))) \
2872 (list file (read-file-modes nil file)))",
8c1a1077 2873 doc: /* Set mode bits of file named FILENAME to MODE (an integer).
ea429250
EZ
2874Only the 12 low bits of MODE are used.
2875
2876Interactively, mode bits are read by `read-file-modes', which accepts
712adc82 2877symbolic notation, like the `chmod' command from GNU Coreutils. */)
5842a27b 2878 (Lisp_Object filename, Lisp_Object mode)
570d7624 2879{
b1d1b865 2880 Lisp_Object absname, encoded_absname;
32f4334d 2881 Lisp_Object handler;
570d7624 2882
4b4deea2 2883 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
b7826503 2884 CHECK_NUMBER (mode);
570d7624 2885
32f4334d
RS
2886 /* If the file name has special constructs in it,
2887 call the corresponding file handler. */
199607e4 2888 handler = Ffind_file_name_handler (absname, Qset_file_modes);
32f4334d 2889 if (!NILP (handler))
199607e4 2890 return call3 (handler, Qset_file_modes, absname, mode);
32f4334d 2891
b1d1b865
RS
2892 encoded_absname = ENCODE_FILE (absname);
2893
42a5b22f 2894 if (chmod (SSDATA (encoded_absname), XINT (mode)) < 0)
199607e4 2895 report_file_error ("Doing chmod", Fcons (absname, Qnil));
570d7624
JB
2896
2897 return Qnil;
2898}
2899
c24e9a53 2900DEFUN ("set-default-file-modes", Fset_default_file_modes, Sset_default_file_modes, 1, 1, 0,
8c1a1077
PJ
2901 doc: /* Set the file permission bits for newly created files.
2902The argument MODE should be an integer; only the low 9 bits are used.
2903This setting is inherited by subprocesses. */)
5842a27b 2904 (Lisp_Object mode)
36a8c287 2905{
b7826503 2906 CHECK_NUMBER (mode);
199607e4 2907
5f85ea58 2908 umask ((~ XINT (mode)) & 0777);
36a8c287
JB
2909
2910 return Qnil;
2911}
2912
c24e9a53 2913DEFUN ("default-file-modes", Fdefault_file_modes, Sdefault_file_modes, 0, 0, 0,
8c1a1077
PJ
2914 doc: /* Return the default file protection for created files.
2915The value is an integer. */)
5842a27b 2916 (void)
36a8c287 2917{
5f85ea58
RS
2918 int realmask;
2919 Lisp_Object value;
36a8c287 2920
5f85ea58
RS
2921 realmask = umask (0);
2922 umask (realmask);
36a8c287 2923
46283abe 2924 XSETINT (value, (~ realmask) & 0777);
5f85ea58 2925 return value;
36a8c287 2926}
819da85b 2927\f
819da85b
EZ
2928
2929DEFUN ("set-file-times", Fset_file_times, Sset_file_times, 1, 2, 0,
f839df0c 2930 doc: /* Set times of file FILENAME to TIMESTAMP.
819da85b
EZ
2931Set both access and modification times.
2932Return t on success, else nil.
f839df0c 2933Use the current time if TIMESTAMP is nil. TIMESTAMP is in the format of
819da85b 2934`current-time'. */)
f839df0c 2935 (Lisp_Object filename, Lisp_Object timestamp)
819da85b
EZ
2936{
2937 Lisp_Object absname, encoded_absname;
2938 Lisp_Object handler;
2939 time_t sec;
2940 int usec;
2941
f839df0c 2942 if (! lisp_time_argument (timestamp, &sec, &usec))
819da85b
EZ
2943 error ("Invalid time specification");
2944
4b4deea2 2945 absname = Fexpand_file_name (filename, BVAR (current_buffer, directory));
819da85b
EZ
2946
2947 /* If the file name has special constructs in it,
2948 call the corresponding file handler. */
2949 handler = Ffind_file_name_handler (absname, Qset_file_times);
2950 if (!NILP (handler))
f839df0c 2951 return call3 (handler, Qset_file_times, absname, timestamp);
819da85b
EZ
2952
2953 encoded_absname = ENCODE_FILE (absname);
5df5e07c 2954
819da85b
EZ
2955 {
2956 EMACS_TIME t;
2957
2958 EMACS_SET_SECS (t, sec);
2959 EMACS_SET_USECS (t, usec);
2960
42a5b22f 2961 if (set_file_times (SSDATA (encoded_absname), t, t))
819da85b
EZ
2962 {
2963#ifdef DOS_NT
2964 struct stat st;
2965
2966 /* Setting times on a directory always fails. */
f68c809d 2967 if (stat (SSDATA (encoded_absname), &st) == 0 && S_ISDIR (st.st_mode))
819da85b
EZ
2968 return Qnil;
2969#endif
2970 report_file_error ("Setting file times", Fcons (absname, Qnil));
2971 return Qnil;
2972 }
2973 }
5df5e07c 2974
819da85b
EZ
2975 return Qt;
2976}
f793dc6c 2977\f
697c17a2 2978#ifdef HAVE_SYNC
85ffea93 2979DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "",
8c1a1077 2980 doc: /* Tell Unix to finish all pending disk updates. */)
5842a27b 2981 (void)
85ffea93
RS
2982{
2983 sync ();
2984 return Qnil;
2985}
2986
697c17a2 2987#endif /* HAVE_SYNC */
85ffea93 2988
570d7624 2989DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0,
8c1a1077
PJ
2990 doc: /* Return t if file FILE1 is newer than file FILE2.
2991If FILE1 does not exist, the answer is nil;
2992otherwise, if FILE2 does not exist, the answer is t. */)
5842a27b 2993 (Lisp_Object file1, Lisp_Object file2)
570d7624 2994{
199607e4 2995 Lisp_Object absname1, absname2;
570d7624
JB
2996 struct stat st;
2997 int mtime1;
32f4334d 2998 Lisp_Object handler;
09121adc 2999 struct gcpro gcpro1, gcpro2;
570d7624 3000
b7826503
PJ
3001 CHECK_STRING (file1);
3002 CHECK_STRING (file2);
570d7624 3003
199607e4
RS
3004 absname1 = Qnil;
3005 GCPRO2 (absname1, file2);
4b4deea2
TT
3006 absname1 = expand_and_dir_to_file (file1, BVAR (current_buffer, directory));
3007 absname2 = expand_and_dir_to_file (file2, BVAR (current_buffer, directory));
09121adc 3008 UNGCPRO;
570d7624 3009
32f4334d
RS
3010 /* If the file name has special constructs in it,
3011 call the corresponding file handler. */
199607e4 3012 handler = Ffind_file_name_handler (absname1, Qfile_newer_than_file_p);
51cf6d37 3013 if (NILP (handler))
199607e4 3014 handler = Ffind_file_name_handler (absname2, Qfile_newer_than_file_p);
32f4334d 3015 if (!NILP (handler))
199607e4 3016 return call3 (handler, Qfile_newer_than_file_p, absname1, absname2);
32f4334d 3017
b1d1b865
RS
3018 GCPRO2 (absname1, absname2);
3019 absname1 = ENCODE_FILE (absname1);
3020 absname2 = ENCODE_FILE (absname2);
3021 UNGCPRO;
3022
42a5b22f 3023 if (stat (SSDATA (absname1), &st) < 0)
570d7624
JB
3024 return Qnil;
3025
3026 mtime1 = st.st_mtime;
3027
42a5b22f 3028 if (stat (SSDATA (absname2), &st) < 0)
570d7624
JB
3029 return Qt;
3030
3031 return (mtime1 > st.st_mtime) ? Qt : Qnil;
3032}
3033\f
6fdaa9a0
KH
3034#ifndef READ_BUF_SIZE
3035#define READ_BUF_SIZE (64 << 10)
3036#endif
3037
98a7d268
KH
3038/* This function is called after Lisp functions to decide a coding
3039 system are called, or when they cause an error. Before they are
3040 called, the current buffer is set unibyte and it contains only a
3041 newly inserted text (thus the buffer was empty before the
3042 insertion).
3043
3044 The functions may set markers, overlays, text properties, or even
3045 alter the buffer contents, change the current buffer.
3046
3047 Here, we reset all those changes by:
3048 o set back the current buffer.
3049 o move all markers and overlays to BEG.
3050 o remove all text properties.
3051 o set back the buffer multibyteness. */
f736ffbf
KH
3052
3053static Lisp_Object
971de7fb 3054decide_coding_unwind (Lisp_Object unwind_data)
f736ffbf 3055{
98a7d268 3056 Lisp_Object multibyte, undo_list, buffer;
f736ffbf 3057
98a7d268
KH
3058 multibyte = XCAR (unwind_data);
3059 unwind_data = XCDR (unwind_data);
3060 undo_list = XCAR (unwind_data);
3061 buffer = XCDR (unwind_data);
3062
3063 if (current_buffer != XBUFFER (buffer))
3064 set_buffer_internal (XBUFFER (buffer));
3065 adjust_markers_for_delete (BEG, BEG_BYTE, Z, Z_BYTE);
3066 adjust_overlays_for_delete (BEG, Z - BEG);
3067 BUF_INTERVALS (current_buffer) = 0;
3068 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3069
3070 /* Now we are safe to change the buffer's multibyteness directly. */
4b4deea2
TT
3071 BVAR (current_buffer, enable_multibyte_characters) = multibyte;
3072 BVAR (current_buffer, undo_list) = undo_list;
f736ffbf
KH
3073
3074 return Qnil;
3075}
3076
55587f8a 3077
1b978129 3078/* Used to pass values from insert-file-contents to read_non_regular. */
55587f8a 3079
1b978129 3080static int non_regular_fd;
ae19ba7c
SM
3081static EMACS_INT non_regular_inserted;
3082static EMACS_INT non_regular_nbytes;
55587f8a 3083
55587f8a 3084
1b978129 3085/* Read from a non-regular file.
438105ed 3086 Read non_regular_nbytes bytes max from non_regular_fd.
1b978129
GM
3087 Non_regular_inserted specifies where to put the read bytes.
3088 Value is the number of bytes read. */
55587f8a
GM
3089
3090static Lisp_Object
9c8a2331 3091read_non_regular (Lisp_Object ignore)
55587f8a 3092{
ae19ba7c 3093 EMACS_INT nbytes;
efdc16c9 3094
1b978129
GM
3095 immediate_quit = 1;
3096 QUIT;
3097 nbytes = emacs_read (non_regular_fd,
5976c3fe
PE
3098 ((char *) BEG_ADDR + PT_BYTE - BEG_BYTE
3099 + non_regular_inserted),
1b978129 3100 non_regular_nbytes);
1b978129
GM
3101 immediate_quit = 0;
3102 return make_number (nbytes);
3103}
55587f8a 3104
d0e2444e 3105
1b978129
GM
3106/* Condition-case handler used when reading from non-regular files
3107 in insert-file-contents. */
3108
3109static Lisp_Object
9c8a2331 3110read_non_regular_quit (Lisp_Object ignore)
1b978129 3111{
55587f8a
GM
3112 return Qnil;
3113}
3114
e69dafad
PE
3115/* Reposition FD to OFFSET, based on WHENCE. This acts like lseek
3116 except that it also tests for OFFSET being out of lseek's range. */
3117static off_t
3118emacs_lseek (int fd, EMACS_INT offset, int whence)
3119{
096a9774
PE
3120 /* Use "&" rather than "&&" to suppress a bogus GCC warning; see
3121 <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772>. */
3122 if (! ((TYPE_MINIMUM (off_t) <= offset) & (offset <= TYPE_MAXIMUM (off_t))))
e69dafad
PE
3123 {
3124 errno = EINVAL;
3125 return -1;
3126 }
3127 return lseek (fd, offset, whence);
3128}
3129
55587f8a 3130
570d7624 3131DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
8c1a1077
PJ
3132 1, 5, 0,
3133 doc: /* Insert contents of file FILENAME after point.
cf6d2357 3134Returns list of absolute file name and number of characters inserted.
6f2528d8
MR
3135If second argument VISIT is non-nil, the buffer's visited filename and
3136last save file modtime are set, and it is marked unmodified. If
3137visiting and the file does not exist, visiting is completed before the
3138error is signaled.
3139
3140The optional third and fourth arguments BEG and END specify what portion
3141of the file to insert. These arguments count bytes in the file, not
3142characters in the buffer. If VISIT is non-nil, BEG and END must be nil.
3143
3144If optional fifth argument REPLACE is non-nil, replace the current
3145buffer contents (in the accessible portion) with the file contents.
3146This is better than simply deleting and inserting the whole thing
3147because (1) it preserves some marker positions and (2) it puts less data
3148in the undo list. When REPLACE is non-nil, the second return value is
3149the number of characters that replace previous buffer contents.
3150
3151This function does code conversion according to the value of
3152`coding-system-for-read' or `file-coding-system-alist', and sets the
3153variable `last-coding-system-used' to the coding system actually used. */)
5842a27b 3154 (Lisp_Object filename, Lisp_Object visit, Lisp_Object beg, Lisp_Object end, Lisp_Object replace)
570d7624
JB
3155{
3156 struct stat st;
3157 register int fd;
ae19ba7c 3158 EMACS_INT inserted = 0;
18a9f8d9 3159 int nochange = 0;
ae19ba7c
SM
3160 register EMACS_INT how_much;
3161 register EMACS_INT unprocessed;
331379bf 3162 int count = SPECPDL_INDEX ();
6f2528d8
MR
3163 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3164 Lisp_Object handler, val, insval, orig_filename, old_undo;
d6a3cc15 3165 Lisp_Object p;
ae19ba7c 3166 EMACS_INT total = 0;
53c34c46 3167 int not_regular = 0;
5976c3fe 3168 char read_buf[READ_BUF_SIZE];
6fdaa9a0 3169 struct coding_system coding;
5976c3fe 3170 char buffer[1 << 14];
727a0b4a 3171 int replace_handled = 0;
ec7adf26 3172 int set_coding_system = 0;
db327c7e 3173 Lisp_Object coding_system;
1b978129 3174 int read_quit = 0;
490ee853 3175 Lisp_Object old_Vdeactivate_mark = Vdeactivate_mark;
68780e2a 3176 int we_locked_file = 0;
db65a627 3177 int deferred_remove_unwind_protect = 0;
32f4334d 3178
95385625
RS
3179 if (current_buffer->base_buffer && ! NILP (visit))
3180 error ("Cannot do file visiting in an indirect buffer");
3181
4b4deea2 3182 if (!NILP (BVAR (current_buffer, read_only)))
95385625
RS
3183 Fbarf_if_buffer_read_only ();
3184
32f4334d 3185 val = Qnil;
d6a3cc15 3186 p = Qnil;
b1d1b865 3187 orig_filename = Qnil;
6f2528d8 3188 old_undo = Qnil;
32f4334d 3189
6f2528d8 3190 GCPRO5 (filename, val, p, orig_filename, old_undo);
570d7624 3191
b7826503 3192 CHECK_STRING (filename);
570d7624
JB
3193 filename = Fexpand_file_name (filename, Qnil);
3194
1c157f8d
KH
3195 /* The value Qnil means that the coding system is not yet
3196 decided. */
3197 coding_system = Qnil;
3198
32f4334d
RS
3199 /* If the file name has special constructs in it,
3200 call the corresponding file handler. */
49307295 3201 handler = Ffind_file_name_handler (filename, Qinsert_file_contents);
32f4334d
RS
3202 if (!NILP (handler))
3203 {
3d0387c0
RS
3204 val = call6 (handler, Qinsert_file_contents, filename,
3205 visit, beg, end, replace);
03699b14
KR
3206 if (CONSP (val) && CONSP (XCDR (val)))
3207 inserted = XINT (XCAR (XCDR (val)));
32f4334d
RS
3208 goto handled;
3209 }
3210
b1d1b865
RS
3211 orig_filename = filename;
3212 filename = ENCODE_FILE (filename);
3213
570d7624
JB
3214 fd = -1;
3215
c1c4693e
RS
3216#ifdef WINDOWSNT
3217 {
3218 Lisp_Object tem = Vw32_get_true_file_attributes;
3219
3220 /* Tell stat to use expensive method to get accurate info. */
3221 Vw32_get_true_file_attributes = Qt;
42a5b22f 3222 total = stat (SSDATA (filename), &st);
c1c4693e
RS
3223 Vw32_get_true_file_attributes = tem;
3224 }
3225 if (total < 0)
3226#else
42a5b22f 3227 if (stat (SSDATA (filename), &st) < 0)
c1c4693e 3228#endif /* WINDOWSNT */
570d7624 3229 {
99bc28f4 3230 badopen:
265a9e55 3231 if (NILP (visit))
b1d1b865 3232 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
570d7624
JB
3233 st.st_mtime = -1;
3234 how_much = 0;
0de6b8f4 3235 if (!NILP (Vcoding_system_for_read))
22d92d6b 3236 Fset (Qbuffer_file_coding_system, Vcoding_system_for_read);
570d7624
JB
3237 goto notfound;
3238 }
3239
be53b411
JB
3240 /* This code will need to be changed in order to work on named
3241 pipes, and it's probably just not worth it. So we should at
3242 least signal an error. */
99bc28f4 3243 if (!S_ISREG (st.st_mode))
330bfe57 3244 {
d4b8687b
RS
3245 not_regular = 1;
3246
3247 if (! NILP (visit))
3248 goto notfound;
3249
3250 if (! NILP (replace) || ! NILP (beg) || ! NILP (end))
24b1ddad
KS
3251 xsignal2 (Qfile_error,
3252 build_string ("not a regular file"), orig_filename);
330bfe57 3253 }
be53b411 3254
99bc28f4 3255 if (fd < 0)
42a5b22f 3256 if ((fd = emacs_open (SSDATA (filename), O_RDONLY, 0)) < 0)
99bc28f4
KH
3257 goto badopen;
3258
3259 /* Replacement should preserve point as it preserves markers. */
3260 if (!NILP (replace))
3261 record_unwind_protect (restore_point_unwind, Fpoint_marker ());
3262
3263 record_unwind_protect (close_file_unwind, make_number (fd));
3264
2a47c44d 3265
15cbd324
EZ
3266 /* Check whether the size is too large or negative, which can happen on a
3267 platform that allows file sizes greater than the maximum off_t value. */
2a47c44d 3268 if (! not_regular
d1f3d2af 3269 && ! (0 <= st.st_size && st.st_size <= BUF_BYTES_MAX))
99561444 3270 buffer_overflow ();
be53b411 3271
9c856db9
GM
3272 /* Prevent redisplay optimizations. */
3273 current_buffer->clip_changed = 1;
3274
9f57b6b4
KH
3275 if (!NILP (visit))
3276 {
3277 if (!NILP (beg) || !NILP (end))
3278 error ("Attempt to visit less than an entire file");
3279 if (BEG < Z && NILP (replace))
3280 error ("Cannot do file visiting in a non-empty buffer");
3281 }
7fded690
JB
3282
3283 if (!NILP (beg))
b7826503 3284 CHECK_NUMBER (beg);
7fded690 3285 else
2acfd7ae 3286 XSETFASTINT (beg, 0);
7fded690
JB
3287
3288 if (!NILP (end))
b7826503 3289 CHECK_NUMBER (end);
7fded690
JB
3290 else
3291 {
d4b8687b
RS
3292 if (! not_regular)
3293 {
3294 XSETINT (end, st.st_size);
68c45bf0 3295
d21dd12d
GM
3296 /* The file size returned from stat may be zero, but data
3297 may be readable nonetheless, for example when this is a
3298 file in the /proc filesystem. */
3299 if (st.st_size == 0)
3300 XSETINT (end, READ_BUF_SIZE);
d4b8687b 3301 }
7fded690
JB
3302 }
3303
356a6224 3304 if (EQ (Vcoding_system_for_read, Qauto_save_coding))
5560aecd 3305 {
75421805 3306 coding_system = coding_inherit_eol_type (Qutf_8_emacs, Qunix);
5560aecd
KH
3307 setup_coding_system (coding_system, &coding);
3308 /* Ensure we set Vlast_coding_system_used. */
3309 set_coding_system = 1;
3310 }
356a6224 3311 else if (BEG < Z)
f736ffbf
KH
3312 {
3313 /* Decide the coding system to use for reading the file now
3314 because we can't use an optimized method for handling
3315 `coding:' tag if the current buffer is not empty. */
f736ffbf 3316 if (!NILP (Vcoding_system_for_read))
db327c7e 3317 coding_system = Vcoding_system_for_read;
f736ffbf
KH
3318 else
3319 {
3320 /* Don't try looking inside a file for a coding system
3321 specification if it is not seekable. */
3322 if (! not_regular && ! NILP (Vset_auto_coding_function))
3323 {
3324 /* Find a coding system specified in the heading two
3325 lines or in the tailing several lines of the file.
3326 We assume that the 1K-byte and 3K-byte for heading
003a7eaa 3327 and tailing respectively are sufficient for this
f736ffbf 3328 purpose. */
ae19ba7c 3329 EMACS_INT nread;
f736ffbf
KH
3330
3331 if (st.st_size <= (1024 * 4))
68c45bf0 3332 nread = emacs_read (fd, read_buf, 1024 * 4);
f736ffbf
KH
3333 else
3334 {
68c45bf0 3335 nread = emacs_read (fd, read_buf, 1024);
f736ffbf
KH
3336 if (nread >= 0)
3337 {
e69dafad 3338 if (lseek (fd, st.st_size - (1024 * 3), SEEK_SET) < 0)
f736ffbf
KH
3339 report_file_error ("Setting file position",
3340 Fcons (orig_filename, Qnil));
68c45bf0 3341 nread += emacs_read (fd, read_buf + nread, 1024 * 3);
f736ffbf
KH
3342 }
3343 }
feb9dc27 3344
f736ffbf
KH
3345 if (nread < 0)
3346 error ("IO error reading %s: %s",
d5db4077 3347 SDATA (orig_filename), emacs_strerror (errno));
f736ffbf
KH
3348 else if (nread > 0)
3349 {
f736ffbf 3350 struct buffer *prev = current_buffer;
f839df0c 3351 Lisp_Object workbuf;
685fc579 3352 struct buffer *buf;
f736ffbf
KH
3353
3354 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
1d92afcd 3355
f839df0c
PE
3356 workbuf = Fget_buffer_create (build_string (" *code-converting-work*"));
3357 buf = XBUFFER (workbuf);
685fc579 3358
29ea8ae9 3359 delete_all_overlays (buf);
4b4deea2
TT
3360 BVAR (buf, directory) = BVAR (current_buffer, directory);
3361 BVAR (buf, read_only) = Qnil;
3362 BVAR (buf, filename) = Qnil;
3363 BVAR (buf, undo_list) = Qt;
29ea8ae9
SM
3364 eassert (buf->overlays_before == NULL);
3365 eassert (buf->overlays_after == NULL);
efdc16c9 3366
685fc579
RS
3367 set_buffer_internal (buf);
3368 Ferase_buffer ();
4b4deea2 3369 BVAR (buf, enable_multibyte_characters) = Qnil;
685fc579 3370
b68864e5 3371 insert_1_both ((char *) read_buf, nread, nread, 0, 0, 0);
f736ffbf 3372 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
db327c7e 3373 coding_system = call2 (Vset_auto_coding_function,
8f924df7 3374 filename, make_number (nread));
f736ffbf 3375 set_buffer_internal (prev);
efdc16c9 3376
f736ffbf
KH
3377 /* Discard the unwind protect for recovering the
3378 current buffer. */
3379 specpdl_ptr--;
3380
3381 /* Rewind the file for the actual read done later. */
e69dafad 3382 if (lseek (fd, 0, SEEK_SET) < 0)
f736ffbf
KH
3383 report_file_error ("Setting file position",
3384 Fcons (orig_filename, Qnil));
3385 }
3386 }
feb9dc27 3387
db327c7e 3388 if (NILP (coding_system))
f736ffbf
KH
3389 {
3390 /* If we have not yet decided a coding system, check
3391 file-coding-system-alist. */
8f924df7 3392 Lisp_Object args[6];
f736ffbf
KH
3393
3394 args[0] = Qinsert_file_contents, args[1] = orig_filename;
3395 args[2] = visit, args[3] = beg, args[4] = end, args[5] = replace;
8f924df7
KH
3396 coding_system = Ffind_operation_coding_system (6, args);
3397 if (CONSP (coding_system))
3398 coding_system = XCAR (coding_system);
f736ffbf
KH
3399 }
3400 }
c9e82392 3401
db327c7e
KH
3402 if (NILP (coding_system))
3403 coding_system = Qundecided;
3404 else
3405 CHECK_CODING_SYSTEM (coding_system);
c8a6d68a 3406
4b4deea2 3407 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
237a6fd2
RS
3408 /* We must suppress all character code conversion except for
3409 end-of-line conversion. */
db327c7e 3410 coding_system = raw_text_coding_system (coding_system);
54369368 3411
db327c7e
KH
3412 setup_coding_system (coding_system, &coding);
3413 /* Ensure we set Vlast_coding_system_used. */
3414 set_coding_system = 1;
f736ffbf 3415 }
6cf71bf1 3416
3d0387c0
RS
3417 /* If requested, replace the accessible part of the buffer
3418 with the file contents. Avoid replacing text at the
3419 beginning or end of the buffer that matches the file contents;
3dbcf3f6
RS
3420 that preserves markers pointing to the unchanged parts.
3421
3422 Here we implement this feature in an optimized way
3423 for the case where code conversion is NOT needed.
3424 The following if-statement handles the case of conversion
727a0b4a
RS
3425 in a less optimal way.
3426
3427 If the code conversion is "automatic" then we try using this
3428 method and hope for the best.
3429 But if we discover the need for conversion, we give up on this method
3430 and let the following if-statement handle the replace job. */
3dbcf3f6 3431 if (!NILP (replace)
f736ffbf 3432 && BEGV < ZV
db327c7e
KH
3433 && (NILP (coding_system)
3434 || ! CODING_REQUIRE_DECODING (&coding)))
3d0387c0 3435 {
ec7adf26
RS
3436 /* same_at_start and same_at_end count bytes,
3437 because file access counts bytes
3438 and BEG and END count bytes. */
ae19ba7c
SM
3439 EMACS_INT same_at_start = BEGV_BYTE;
3440 EMACS_INT same_at_end = ZV_BYTE;
3441 EMACS_INT overlap;
6fdaa9a0
KH
3442 /* There is still a possibility we will find the need to do code
3443 conversion. If that happens, we set this variable to 1 to
727a0b4a 3444 give up on handling REPLACE in the optimized way. */
6fdaa9a0 3445 int giveup_match_end = 0;
9c28748f 3446
4d2a0879
RS
3447 if (XINT (beg) != 0)
3448 {
e69dafad 3449 if (emacs_lseek (fd, XINT (beg), SEEK_SET) < 0)
4d2a0879 3450 report_file_error ("Setting file position",
b1d1b865 3451 Fcons (orig_filename, Qnil));
4d2a0879
RS
3452 }
3453
3d0387c0
RS
3454 immediate_quit = 1;
3455 QUIT;
3456 /* Count how many chars at the start of the file
3457 match the text at the beginning of the buffer. */
3458 while (1)
3459 {
ae19ba7c 3460 EMACS_INT nread, bufpos;
3d0387c0 3461
68c45bf0 3462 nread = emacs_read (fd, buffer, sizeof buffer);
3d0387c0
RS
3463 if (nread < 0)
3464 error ("IO error reading %s: %s",
5976c3fe 3465 SSDATA (orig_filename), emacs_strerror (errno));
3d0387c0
RS
3466 else if (nread == 0)
3467 break;
6fdaa9a0 3468
db327c7e 3469 if (CODING_REQUIRE_DETECTION (&coding))
727a0b4a 3470 {
5976c3fe
PE
3471 coding_system = detect_coding_system ((unsigned char *) buffer,
3472 nread, nread, 1, 0,
db327c7e
KH
3473 coding_system);
3474 setup_coding_system (coding_system, &coding);
727a0b4a
RS
3475 }
3476
db327c7e
KH
3477 if (CODING_REQUIRE_DECODING (&coding))
3478 /* We found that the file should be decoded somehow.
727a0b4a
RS
3479 Let's give up here. */
3480 {
3481 giveup_match_end = 1;
3482 break;
3483 }
3484
3d0387c0 3485 bufpos = 0;
ec7adf26 3486 while (bufpos < nread && same_at_start < ZV_BYTE
6fdaa9a0 3487 && FETCH_BYTE (same_at_start) == buffer[bufpos])
3d0387c0
RS
3488 same_at_start++, bufpos++;
3489 /* If we found a discrepancy, stop the scan.
8e6208c5 3490 Otherwise loop around and scan the next bufferful. */
3d0387c0
RS
3491 if (bufpos != nread)
3492 break;
3493 }
3494 immediate_quit = 0;
3495 /* If the file matches the buffer completely,
3496 there's no need to replace anything. */
ec7adf26 3497 if (same_at_start - BEGV_BYTE == XINT (end))
3d0387c0 3498 {
68c45bf0 3499 emacs_close (fd);
a1d2b64a 3500 specpdl_ptr--;
1051b3b3 3501 /* Truncate the buffer to the size of the file. */
7dae4502 3502 del_range_1 (same_at_start, same_at_end, 0, 0);
3d0387c0
RS
3503 goto handled;
3504 }
3505 immediate_quit = 1;
3506 QUIT;
3507 /* Count how many chars at the end of the file
6fdaa9a0
KH
3508 match the text at the end of the buffer. But, if we have
3509 already found that decoding is necessary, don't waste time. */
3510 while (!giveup_match_end)
3d0387c0 3511 {
ae19ba7c 3512 EMACS_INT total_read, nread, bufpos, curpos, trial;
3d0387c0
RS
3513
3514 /* At what file position are we now scanning? */
ec7adf26 3515 curpos = XINT (end) - (ZV_BYTE - same_at_end);
fc81fa9e
KH
3516 /* If the entire file matches the buffer tail, stop the scan. */
3517 if (curpos == 0)
3518 break;
3d0387c0
RS
3519 /* How much can we scan in the next step? */
3520 trial = min (curpos, sizeof buffer);
e69dafad 3521 if (emacs_lseek (fd, curpos - trial, SEEK_SET) < 0)
3d0387c0 3522 report_file_error ("Setting file position",
b1d1b865 3523 Fcons (orig_filename, Qnil));
3d0387c0 3524
b02439c8 3525 total_read = nread = 0;
3d0387c0
RS
3526 while (total_read < trial)
3527 {
68c45bf0 3528 nread = emacs_read (fd, buffer + total_read, trial - total_read);
2bd2273e 3529 if (nread < 0)
3d0387c0 3530 error ("IO error reading %s: %s",
d5db4077 3531 SDATA (orig_filename), emacs_strerror (errno));
2bd2273e
GM
3532 else if (nread == 0)
3533 break;
3d0387c0
RS
3534 total_read += nread;
3535 }
efdc16c9 3536
8e6208c5 3537 /* Scan this bufferful from the end, comparing with
3d0387c0
RS
3538 the Emacs buffer. */
3539 bufpos = total_read;
efdc16c9 3540
3d0387c0
RS
3541 /* Compare with same_at_start to avoid counting some buffer text
3542 as matching both at the file's beginning and at the end. */
3543 while (bufpos > 0 && same_at_end > same_at_start
6fdaa9a0 3544 && FETCH_BYTE (same_at_end - 1) == buffer[bufpos - 1])
3d0387c0 3545 same_at_end--, bufpos--;
727a0b4a 3546
3d0387c0 3547 /* If we found a discrepancy, stop the scan.
8e6208c5 3548 Otherwise loop around and scan the preceding bufferful. */
3d0387c0 3549 if (bufpos != 0)
727a0b4a
RS
3550 {
3551 /* If this discrepancy is because of code conversion,
3552 we cannot use this method; giveup and try the other. */
3553 if (same_at_end > same_at_start
3554 && FETCH_BYTE (same_at_end - 1) >= 0200
4b4deea2 3555 && ! NILP (BVAR (current_buffer, enable_multibyte_characters))
c8a6d68a 3556 && (CODING_MAY_REQUIRE_DECODING (&coding)))
727a0b4a
RS
3557 giveup_match_end = 1;
3558 break;
3559 }
b02439c8
GM
3560
3561 if (nread == 0)
3562 break;
3d0387c0
RS
3563 }
3564 immediate_quit = 0;
9c28748f 3565
727a0b4a
RS
3566 if (! giveup_match_end)
3567 {
ae19ba7c 3568 EMACS_INT temp;
ec7adf26 3569
727a0b4a 3570 /* We win! We can handle REPLACE the optimized way. */
9c28748f 3571
20f6783d
RS
3572 /* Extend the start of non-matching text area to multibyte
3573 character boundary. */
4b4deea2 3574 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
20f6783d
RS
3575 while (same_at_start > BEGV_BYTE
3576 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
3577 same_at_start--;
3578
3579 /* Extend the end of non-matching text area to multibyte
71312b68 3580 character boundary. */
4b4deea2 3581 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
ec7adf26
RS
3582 while (same_at_end < ZV_BYTE
3583 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
71312b68
RS
3584 same_at_end++;
3585
727a0b4a 3586 /* Don't try to reuse the same piece of text twice. */
ec7adf26
RS
3587 overlap = (same_at_start - BEGV_BYTE
3588 - (same_at_end + st.st_size - ZV));
727a0b4a
RS
3589 if (overlap > 0)
3590 same_at_end += overlap;
9c28748f 3591
727a0b4a 3592 /* Arrange to read only the nonmatching middle part of the file. */
ec7adf26
RS
3593 XSETFASTINT (beg, XINT (beg) + (same_at_start - BEGV_BYTE));
3594 XSETFASTINT (end, XINT (end) - (ZV_BYTE - same_at_end));
3dbcf3f6 3595
ec7adf26 3596 del_range_byte (same_at_start, same_at_end, 0);
727a0b4a 3597 /* Insert from the file at the proper position. */
ec7adf26
RS
3598 temp = BYTE_TO_CHAR (same_at_start);
3599 SET_PT_BOTH (temp, same_at_start);
727a0b4a
RS
3600
3601 /* If display currently starts at beginning of line,
3602 keep it that way. */
3603 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
3604 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
3605
3606 replace_handled = 1;
3607 }
3dbcf3f6
RS
3608 }
3609
3610 /* If requested, replace the accessible part of the buffer
3611 with the file contents. Avoid replacing text at the
3612 beginning or end of the buffer that matches the file contents;
3613 that preserves markers pointing to the unchanged parts.
3614
3615 Here we implement this feature for the case where code conversion
3616 is needed, in a simple way that needs a lot of memory.
3617 The preceding if-statement handles the case of no conversion
3618 in a more optimized way. */
f736ffbf 3619 if (!NILP (replace) && ! replace_handled && BEGV < ZV)
3dbcf3f6 3620 {
13818c30
SM
3621 EMACS_INT same_at_start = BEGV_BYTE;
3622 EMACS_INT same_at_end = ZV_BYTE;
3623 EMACS_INT same_at_start_charpos;
3624 EMACS_INT inserted_chars;
3625 EMACS_INT overlap;
3626 EMACS_INT bufpos;
db327c7e 3627 unsigned char *decoded;
ae19ba7c 3628 EMACS_INT temp;
43aae36e 3629 EMACS_INT this = 0;
8f924df7 3630 int this_count = SPECPDL_INDEX ();
4b4deea2 3631 int multibyte = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
5b359650 3632 Lisp_Object conversion_buffer;
db327c7e 3633
5b359650 3634 conversion_buffer = code_conversion_save (1, multibyte);
3dbcf3f6
RS
3635
3636 /* First read the whole file, performing code conversion into
3637 CONVERSION_BUFFER. */
3638
e69dafad 3639 if (emacs_lseek (fd, XINT (beg), SEEK_SET) < 0)
8f924df7
KH
3640 report_file_error ("Setting file position",
3641 Fcons (orig_filename, Qnil));
727a0b4a 3642
3dbcf3f6
RS
3643 total = st.st_size; /* Total bytes in the file. */
3644 how_much = 0; /* Bytes read from file so far. */
3645 inserted = 0; /* Bytes put into CONVERSION_BUFFER so far. */
3646 unprocessed = 0; /* Bytes not processed in previous loop. */
3647
2ba48777 3648 GCPRO1 (conversion_buffer);
3dbcf3f6
RS
3649 while (how_much < total)
3650 {
db327c7e
KH
3651 /* We read one bunch by one (READ_BUF_SIZE bytes) to allow
3652 quitting while reading a huge while. */
3dbcf3f6 3653 /* try is reserved in some compilers (Microsoft C) */
ae19ba7c
SM
3654 EMACS_INT trytry = min (total - how_much,
3655 READ_BUF_SIZE - unprocessed);
3dbcf3f6
RS
3656
3657 /* Allow quitting out of the actual I/O. */
3658 immediate_quit = 1;
3659 QUIT;
db327c7e 3660 this = emacs_read (fd, read_buf + unprocessed, trytry);
3dbcf3f6
RS
3661 immediate_quit = 0;
3662
db327c7e 3663 if (this <= 0)
43aae36e 3664 break;
3dbcf3f6
RS
3665
3666 how_much += this;
3667
bf1c0f27
SM
3668 BUF_TEMP_SET_PT (XBUFFER (conversion_buffer),
3669 BUF_Z (XBUFFER (conversion_buffer)));
5976c3fe
PE
3670 decode_coding_c_string (&coding, (unsigned char *) read_buf,
3671 unprocessed + this, conversion_buffer);
db327c7e
KH
3672 unprocessed = coding.carryover_bytes;
3673 if (coding.carryover_bytes > 0)
72af86bd 3674 memcpy (read_buf, coding.carryover, unprocessed);
3dbcf3f6 3675 }
2ba48777 3676 UNGCPRO;
db327c7e 3677 emacs_close (fd);
3dbcf3f6 3678
db65a627
CY
3679 /* We should remove the unwind_protect calling
3680 close_file_unwind, but other stuff has been added the stack,
3681 so defer the removal till we reach the `handled' label. */
3682 deferred_remove_unwind_protect = 1;
3683
db327c7e
KH
3684 /* At this point, HOW_MUCH should equal TOTAL, or should be <= 0
3685 if we couldn't read the file. */
3dbcf3f6 3686
43aae36e 3687 if (this < 0)
4ed925c6
MB
3688 error ("IO error reading %s: %s",
3689 SDATA (orig_filename), emacs_strerror (errno));
3dbcf3f6 3690
db327c7e
KH
3691 if (unprocessed > 0)
3692 {
3693 coding.mode |= CODING_MODE_LAST_BLOCK;
5976c3fe
PE
3694 decode_coding_c_string (&coding, (unsigned char *) read_buf,
3695 unprocessed, conversion_buffer);
db327c7e
KH
3696 coding.mode &= ~CODING_MODE_LAST_BLOCK;
3697 }
3698
50b06221 3699 coding_system = CODING_ID_NAME (coding.id);
f6a07420 3700 set_coding_system = 1;
db327c7e 3701 decoded = BUF_BEG_ADDR (XBUFFER (conversion_buffer));
50342b35
KH
3702 inserted = (BUF_Z_BYTE (XBUFFER (conversion_buffer))
3703 - BUF_BEG_BYTE (XBUFFER (conversion_buffer)));
db327c7e
KH
3704
3705 /* Compare the beginning of the converted string with the buffer
3706 text. */
3dbcf3f6
RS
3707
3708 bufpos = 0;
3709 while (bufpos < inserted && same_at_start < same_at_end
db327c7e 3710 && FETCH_BYTE (same_at_start) == decoded[bufpos])
3dbcf3f6
RS
3711 same_at_start++, bufpos++;
3712
db327c7e 3713 /* If the file matches the head of buffer completely,
3dbcf3f6
RS
3714 there's no need to replace anything. */
3715
3716 if (bufpos == inserted)
3717 {
3dbcf3f6 3718 /* Truncate the buffer to the size of the file. */
18a9f8d9
SM
3719 if (same_at_start == same_at_end)
3720 nochange = 1;
3721 else
3722 del_range_byte (same_at_start, same_at_end, 0);
427f5aab 3723 inserted = 0;
e8553dd1
KH
3724
3725 unbind_to (this_count, Qnil);
3dbcf3f6
RS
3726 goto handled;
3727 }
3728
db327c7e
KH
3729 /* Extend the start of non-matching text area to the previous
3730 multibyte character boundary. */
4b4deea2 3731 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
20f6783d
RS
3732 while (same_at_start > BEGV_BYTE
3733 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
3734 same_at_start--;
3735
3dbcf3f6
RS
3736 /* Scan this bufferful from the end, comparing with
3737 the Emacs buffer. */
3738 bufpos = inserted;
3739
3740 /* Compare with same_at_start to avoid counting some buffer text
3741 as matching both at the file's beginning and at the end. */
3742 while (bufpos > 0 && same_at_end > same_at_start
db327c7e 3743 && FETCH_BYTE (same_at_end - 1) == decoded[bufpos - 1])
3dbcf3f6
RS
3744 same_at_end--, bufpos--;
3745
db327c7e
KH
3746 /* Extend the end of non-matching text area to the next
3747 multibyte character boundary. */
4b4deea2 3748 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
20f6783d
RS
3749 while (same_at_end < ZV_BYTE
3750 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
3751 same_at_end++;
3752
3dbcf3f6 3753 /* Don't try to reuse the same piece of text twice. */
ec7adf26 3754 overlap = same_at_start - BEGV_BYTE - (same_at_end + inserted - ZV_BYTE);
3dbcf3f6
RS
3755 if (overlap > 0)
3756 same_at_end += overlap;
3757
727a0b4a
RS
3758 /* If display currently starts at beginning of line,
3759 keep it that way. */
3760 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
3761 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
3762
3dbcf3f6
RS
3763 /* Replace the chars that we need to replace,
3764 and update INSERTED to equal the number of bytes
db327c7e 3765 we are taking from the decoded string. */
4b70e2c9 3766 inserted -= (ZV_BYTE - same_at_end) + (same_at_start - BEGV_BYTE);
427f5aab 3767
643c73b9 3768 if (same_at_end != same_at_start)
427f5aab
KH
3769 {
3770 del_range_byte (same_at_start, same_at_end, 0);
3771 temp = GPT;
3772 same_at_start = GPT_BYTE;
3773 }
643c73b9
RS
3774 else
3775 {
643c73b9 3776 temp = BYTE_TO_CHAR (same_at_start);
643c73b9 3777 }
427f5aab
KH
3778 /* Insert from the file at the proper position. */
3779 SET_PT_BOTH (temp, same_at_start);
50342b35
KH
3780 same_at_start_charpos
3781 = buf_bytepos_to_charpos (XBUFFER (conversion_buffer),
7f5d2c72
SM
3782 same_at_start - BEGV_BYTE
3783 + BUF_BEG_BYTE (XBUFFER (conversion_buffer)));
50342b35
KH
3784 inserted_chars
3785 = (buf_bytepos_to_charpos (XBUFFER (conversion_buffer),
7f5d2c72
SM
3786 same_at_start + inserted - BEGV_BYTE
3787 + BUF_BEG_BYTE (XBUFFER (conversion_buffer)))
50342b35 3788 - same_at_start_charpos);
d07af40d
KH
3789 /* This binding is to avoid ask-user-about-supersession-threat
3790 being called in insert_from_buffer (via in
3791 prepare_to_modify_buffer). */
3792 specbind (intern ("buffer-file-name"), Qnil);
db327c7e 3793 insert_from_buffer (XBUFFER (conversion_buffer),
50342b35 3794 same_at_start_charpos, inserted_chars, 0);
427f5aab
KH
3795 /* Set `inserted' to the number of inserted characters. */
3796 inserted = PT - temp;
77343e1d
KH
3797 /* Set point before the inserted characters. */
3798 SET_PT_BOTH (temp, same_at_start);
3dbcf3f6 3799
db327c7e 3800 unbind_to (this_count, Qnil);
3dbcf3f6 3801
3dbcf3f6 3802 goto handled;
3d0387c0
RS
3803 }
3804
d4b8687b 3805 if (! not_regular)
1c8e352f 3806 total = XINT (end) - XINT (beg);
d4b8687b
RS
3807 else
3808 /* For a special file, all we can do is guess. */
3809 total = READ_BUF_SIZE;
570d7624 3810
8b913b57 3811 if (NILP (visit) && total > 0)
68780e2a
RS
3812 {
3813#ifdef CLASH_DETECTION
4b4deea2 3814 if (!NILP (BVAR (current_buffer, file_truename))
68780e2a 3815 /* Make binding buffer-file-name to nil effective. */
4b4deea2 3816 && !NILP (BVAR (current_buffer, filename))
68780e2a
RS
3817 && SAVE_MODIFF >= MODIFF)
3818 we_locked_file = 1;
3819#endif /* CLASH_DETECTION */
3820 prepare_to_modify_buffer (GPT, GPT, NULL);
3821 }
570d7624 3822
7fe52289 3823 move_gap (PT);
7fded690
JB
3824 if (GAP_SIZE < total)
3825 make_gap (total - GAP_SIZE);
3826
a1d2b64a 3827 if (XINT (beg) != 0 || !NILP (replace))
7fded690 3828 {
e69dafad 3829 if (emacs_lseek (fd, XINT (beg), SEEK_SET) < 0)
b1d1b865
RS
3830 report_file_error ("Setting file position",
3831 Fcons (orig_filename, Qnil));
7fded690
JB
3832 }
3833
6fdaa9a0 3834 /* In the following loop, HOW_MUCH contains the total bytes read so
c8a6d68a
KH
3835 far for a regular file, and not changed for a special file. But,
3836 before exiting the loop, it is set to a negative value if I/O
3837 error occurs. */
a1d2b64a 3838 how_much = 0;
efdc16c9 3839
6fdaa9a0
KH
3840 /* Total bytes inserted. */
3841 inserted = 0;
efdc16c9 3842
c8a6d68a 3843 /* Here, we don't do code conversion in the loop. It is done by
db327c7e 3844 decode_coding_gap after all data are read into the buffer. */
1b978129 3845 {
ae19ba7c 3846 EMACS_INT gap_size = GAP_SIZE;
efdc16c9 3847
1b978129
GM
3848 while (how_much < total)
3849 {
5e570b75 3850 /* try is reserved in some compilers (Microsoft C) */
ae19ba7c
SM
3851 EMACS_INT trytry = min (total - how_much, READ_BUF_SIZE);
3852 EMACS_INT this;
570d7624 3853
1b978129
GM
3854 if (not_regular)
3855 {
f839df0c 3856 Lisp_Object nbytes;
570d7624 3857
1b978129
GM
3858 /* Maybe make more room. */
3859 if (gap_size < trytry)
3860 {
3861 make_gap (total - gap_size);
3862 gap_size = GAP_SIZE;
3863 }
3864
3865 /* Read from the file, capturing `quit'. When an
3866 error occurs, end the loop, and arrange for a quit
3867 to be signaled after decoding the text we read. */
3868 non_regular_fd = fd;
3869 non_regular_inserted = inserted;
3870 non_regular_nbytes = trytry;
f839df0c
PE
3871 nbytes = internal_condition_case_1 (read_non_regular,
3872 Qnil, Qerror,
3873 read_non_regular_quit);
3874 if (NILP (nbytes))
1b978129
GM
3875 {
3876 read_quit = 1;
3877 break;
3878 }
3879
f839df0c 3880 this = XINT (nbytes);
1b978129
GM
3881 }
3882 else
3883 {
3884 /* Allow quitting out of the actual I/O. We don't make text
3885 part of the buffer until all the reading is done, so a C-g
3886 here doesn't do any harm. */
3887 immediate_quit = 1;
3888 QUIT;
5976c3fe
PE
3889 this = emacs_read (fd,
3890 ((char *) BEG_ADDR + PT_BYTE - BEG_BYTE
3891 + inserted),
3892 trytry);
1b978129
GM
3893 immediate_quit = 0;
3894 }
efdc16c9 3895
1b978129
GM
3896 if (this <= 0)
3897 {
3898 how_much = this;
3899 break;
3900 }
3901
3902 gap_size -= this;
3903
3904 /* For a regular file, where TOTAL is the real size,
3905 count HOW_MUCH to compare with it.
3906 For a special file, where TOTAL is just a buffer size,
3907 so don't bother counting in HOW_MUCH.
3908 (INSERTED is where we count the number of characters inserted.) */
3909 if (! not_regular)
3910 how_much += this;
3911 inserted += this;
3912 }
3913 }
3914
68780e2a
RS
3915 /* Now we have read all the file data into the gap.
3916 If it was empty, undo marking the buffer modified. */
3917
3918 if (inserted == 0)
3919 {
6840d350 3920#ifdef CLASH_DETECTION
68780e2a 3921 if (we_locked_file)
4b4deea2 3922 unlock_file (BVAR (current_buffer, file_truename));
6840d350 3923#endif
68780e2a
RS
3924 Vdeactivate_mark = old_Vdeactivate_mark;
3925 }
83c1cf6d
RS
3926 else
3927 Vdeactivate_mark = Qt;
68780e2a 3928
1b978129
GM
3929 /* Make the text read part of the buffer. */
3930 GAP_SIZE -= inserted;
3931 GPT += inserted;
3932 GPT_BYTE += inserted;
3933 ZV += inserted;
3934 ZV_BYTE += inserted;
3935 Z += inserted;
3936 Z_BYTE += inserted;
6fdaa9a0 3937
c8a6d68a
KH
3938 if (GAP_SIZE > 0)
3939 /* Put an anchor to ensure multi-byte form ends at gap. */
3940 *GPT_ADDR = 0;
d4b8687b 3941
68c45bf0 3942 emacs_close (fd);
6fdaa9a0 3943
c8a6d68a
KH
3944 /* Discard the unwind protect for closing the file. */
3945 specpdl_ptr--;
6fdaa9a0 3946
c8a6d68a
KH
3947 if (how_much < 0)
3948 error ("IO error reading %s: %s",
d5db4077 3949 SDATA (orig_filename), emacs_strerror (errno));
ec7adf26 3950
f8569325
DL
3951 notfound:
3952
db327c7e 3953 if (NILP (coding_system))
c8a6d68a 3954 {
2df42e09 3955 /* The coding system is not yet decided. Decide it by an
dfe35e7b
RS
3956 optimized method for handling `coding:' tag.
3957
3958 Note that we can get here only if the buffer was empty
3959 before the insertion. */
f736ffbf 3960
2df42e09 3961 if (!NILP (Vcoding_system_for_read))
db327c7e 3962 coding_system = Vcoding_system_for_read;
2df42e09
KH
3963 else
3964 {
98a7d268
KH
3965 /* Since we are sure that the current buffer was empty
3966 before the insertion, we can toggle
3967 enable-multibyte-characters directly here without taking
9a7f80aa
KH
3968 care of marker adjustment. By this way, we can run Lisp
3969 program safely before decoding the inserted text. */
98a7d268 3970 Lisp_Object unwind_data;
f839df0c 3971 int count1 = SPECPDL_INDEX ();
2df42e09 3972
4b4deea2
TT
3973 unwind_data = Fcons (BVAR (current_buffer, enable_multibyte_characters),
3974 Fcons (BVAR (current_buffer, undo_list),
98a7d268 3975 Fcurrent_buffer ()));
4b4deea2
TT
3976 BVAR (current_buffer, enable_multibyte_characters) = Qnil;
3977 BVAR (current_buffer, undo_list) = Qt;
98a7d268
KH
3978 record_unwind_protect (decide_coding_unwind, unwind_data);
3979
3980 if (inserted > 0 && ! NILP (Vset_auto_coding_function))
3981 {
db327c7e 3982 coding_system = call2 (Vset_auto_coding_function,
8f924df7 3983 filename, make_number (inserted));
2df42e09 3984 }
f736ffbf 3985
db327c7e 3986 if (NILP (coding_system))
2df42e09
KH
3987 {
3988 /* If the coding system is not yet decided, check
3989 file-coding-system-alist. */
8f924df7 3990 Lisp_Object args[6];
f736ffbf 3991
2df42e09
KH
3992 args[0] = Qinsert_file_contents, args[1] = orig_filename;
3993 args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil;
8f924df7
KH
3994 coding_system = Ffind_operation_coding_system (6, args);
3995 if (CONSP (coding_system))
3996 coding_system = XCAR (coding_system);
f736ffbf 3997 }
f839df0c 3998 unbind_to (count1, Qnil);
98a7d268 3999 inserted = Z_BYTE - BEG_BYTE;
2df42e09 4000 }
f736ffbf 4001
db327c7e
KH
4002 if (NILP (coding_system))
4003 coding_system = Qundecided;
4004 else
4005 CHECK_CODING_SYSTEM (coding_system);
f736ffbf 4006
4b4deea2 4007 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
237a6fd2 4008 /* We must suppress all character code conversion except for
2df42e09 4009 end-of-line conversion. */
db327c7e 4010 coding_system = raw_text_coding_system (coding_system);
db327c7e
KH
4011 setup_coding_system (coding_system, &coding);
4012 /* Ensure we set Vlast_coding_system_used. */
4013 set_coding_system = 1;
2df42e09 4014 }
f736ffbf 4015
db327c7e 4016 if (!NILP (visit))
8c3b9441 4017 {
db327c7e 4018 /* When we visit a file by raw-text, we change the buffer to
9a7f80aa 4019 unibyte. */
db327c7e
KH
4020 if (CODING_FOR_UNIBYTE (&coding)
4021 /* Can't do this if part of the buffer might be preserved. */
4022 && NILP (replace))
4023 /* Visiting a file with these coding system makes the buffer
4024 unibyte. */
4b4deea2 4025 BVAR (current_buffer, enable_multibyte_characters) = Qnil;
8c3b9441
KH
4026 }
4027
4b4deea2 4028 coding.dst_multibyte = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
5b359650 4029 if (CODING_MAY_REQUIRE_DECODING (&coding)
1c157f8d 4030 && (inserted > 0 || CODING_REQUIRE_FLUSHING (&coding)))
2df42e09 4031 {
db327c7e
KH
4032 move_gap_both (PT, PT_BYTE);
4033 GAP_SIZE += inserted;
4034 ZV_BYTE -= inserted;
4035 Z_BYTE -= inserted;
4036 ZV -= inserted;
4037 Z -= inserted;
4038 decode_coding_gap (&coding, inserted, inserted);
4039 inserted = coding.produced_char;
5b359650 4040 coding_system = CODING_ID_NAME (coding.id);
2df42e09 4041 }
db327c7e
KH
4042 else if (inserted > 0)
4043 adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted,
4044 inserted);
570d7624 4045
cf6d2357
RS
4046 /* Now INSERTED is measured in characters. */
4047
32f4334d 4048 handled:
570d7624 4049
db65a627
CY
4050 if (deferred_remove_unwind_protect)
4051 /* If requested above, discard the unwind protect for closing the
4052 file. */
4053 specpdl_ptr--;
4054
265a9e55 4055 if (!NILP (visit))
570d7624 4056 {
4b4deea2
TT
4057 if (!EQ (BVAR (current_buffer, undo_list), Qt) && !nochange)
4058 BVAR (current_buffer, undo_list) = Qnil;
62bcf009 4059
a7e82472
RS
4060 if (NILP (handler))
4061 {
4062 current_buffer->modtime = st.st_mtime;
58b963f7 4063 current_buffer->modtime_size = st.st_size;
4b4deea2 4064 BVAR (current_buffer, filename) = orig_filename;
a7e82472 4065 }
62bcf009 4066
95385625 4067 SAVE_MODIFF = MODIFF;
0b5397c2 4068 BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
4b4deea2 4069 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
570d7624 4070#ifdef CLASH_DETECTION
32f4334d
RS
4071 if (NILP (handler))
4072 {
4b4deea2
TT
4073 if (!NILP (BVAR (current_buffer, file_truename)))
4074 unlock_file (BVAR (current_buffer, file_truename));
32f4334d
RS
4075 unlock_file (filename);
4076 }
570d7624 4077#endif /* CLASH_DETECTION */
330bfe57 4078 if (not_regular)
24b1ddad
KS
4079 xsignal2 (Qfile_error,
4080 build_string ("not a regular file"), orig_filename);
570d7624
JB
4081 }
4082
b6426b03 4083 if (set_coding_system)
8f924df7 4084 Vlast_coding_system_used = coding_system;
b6426b03 4085
2080470e 4086 if (! NILP (Ffboundp (Qafter_insert_file_set_coding)))
b6426b03 4087 {
37a3c774
KH
4088 insval = call2 (Qafter_insert_file_set_coding, make_number (inserted),
4089 visit);
b6426b03
KH
4090 if (! NILP (insval))
4091 {
4092 CHECK_NUMBER (insval);
4093 inserted = XFASTINT (insval);
4094 }
4095 }
4096
6420e80c 4097 /* Decode file format. */
c8a6d68a 4098 if (inserted > 0)
0d420e88 4099 {
6420e80c 4100 /* Don't run point motion or modification hooks when decoding. */
f839df0c 4101 int count1 = SPECPDL_INDEX ();
ae19ba7c 4102 EMACS_INT old_inserted = inserted;
6f2528d8
MR
4103 specbind (Qinhibit_point_motion_hooks, Qt);
4104 specbind (Qinhibit_modification_hooks, Qt);
4105
6420e80c 4106 /* Save old undo list and don't record undo for decoding. */
4b4deea2
TT
4107 old_undo = BVAR (current_buffer, undo_list);
4108 BVAR (current_buffer, undo_list) = Qt;
efdc16c9 4109
6f2528d8 4110 if (NILP (replace))
ed8e506f 4111 {
6f2528d8
MR
4112 insval = call3 (Qformat_decode,
4113 Qnil, make_number (inserted), visit);
4114 CHECK_NUMBER (insval);
4115 inserted = XFASTINT (insval);
4116 }
4117 else
4118 {
4119 /* If REPLACE is non-nil and we succeeded in not replacing the
6420e80c
AS
4120 beginning or end of the buffer text with the file's contents,
4121 call format-decode with `point' positioned at the beginning
4122 of the buffer and `inserted' equalling the number of
4123 characters in the buffer. Otherwise, format-decode might
4124 fail to correctly analyze the beginning or end of the buffer.
4125 Hence we temporarily save `point' and `inserted' here and
4126 restore `point' iff format-decode did not insert or delete
4127 any text. Otherwise we leave `point' at point-min. */
ae19ba7c
SM
4128 EMACS_INT opoint = PT;
4129 EMACS_INT opoint_byte = PT_BYTE;
4130 EMACS_INT oinserted = ZV - BEGV;
cac4219c 4131 int ochars_modiff = CHARS_MODIFF;
1f163f28
MA
4132
4133 TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE);
6f2528d8
MR
4134 insval = call3 (Qformat_decode,
4135 Qnil, make_number (oinserted), visit);
4136 CHECK_NUMBER (insval);
cac4219c
MR
4137 if (ochars_modiff == CHARS_MODIFF)
4138 /* format_decode didn't modify buffer's characters => move
4139 point back to position before inserted text and leave
6420e80c 4140 value of inserted alone. */
6f2528d8 4141 SET_PT_BOTH (opoint, opoint_byte);
cac4219c
MR
4142 else
4143 /* format_decode modified buffer's characters => consider
6420e80c 4144 entire buffer changed and leave point at point-min. */
cac4219c 4145 inserted = XFASTINT (insval);
ed8e506f 4146 }
efdc16c9 4147
6f2528d8 4148 /* For consistency with format-decode call these now iff inserted > 0
6420e80c 4149 (martin 2007-06-28). */
6f2528d8
MR
4150 p = Vafter_insert_file_functions;
4151 while (CONSP (p))
4152 {
4153 if (NILP (replace))
4154 {
4155 insval = call1 (XCAR (p), make_number (inserted));
4156 if (!NILP (insval))
4157 {
4158 CHECK_NUMBER (insval);
4159 inserted = XFASTINT (insval);
4160 }
4161 }
4162 else
4163 {
6420e80c
AS
4164 /* For the rationale of this see the comment on
4165 format-decode above. */
ae19ba7c
SM
4166 EMACS_INT opoint = PT;
4167 EMACS_INT opoint_byte = PT_BYTE;
4168 EMACS_INT oinserted = ZV - BEGV;
cac4219c 4169 int ochars_modiff = CHARS_MODIFF;
1f163f28 4170
6f2528d8
MR
4171 TEMP_SET_PT_BOTH (BEGV, BEGV_BYTE);
4172 insval = call1 (XCAR (p), make_number (oinserted));
4173 if (!NILP (insval))
4174 {
4175 CHECK_NUMBER (insval);
cac4219c
MR
4176 if (ochars_modiff == CHARS_MODIFF)
4177 /* after_insert_file_functions didn't modify
4178 buffer's characters => move point back to
4179 position before inserted text and leave value of
6420e80c 4180 inserted alone. */
6f2528d8 4181 SET_PT_BOTH (opoint, opoint_byte);
cac4219c
MR
4182 else
4183 /* after_insert_file_functions did modify buffer's
4184 characters => consider entire buffer changed and
6420e80c 4185 leave point at point-min. */
cac4219c 4186 inserted = XFASTINT (insval);
6f2528d8
MR
4187 }
4188 }
4189
4190 QUIT;
4191 p = XCDR (p);
ed8e506f 4192 }
efdc16c9 4193
6f2528d8
MR
4194 if (NILP (visit))
4195 {
4b4deea2 4196 BVAR (current_buffer, undo_list) = old_undo;
6420e80c 4197 if (CONSP (old_undo) && inserted != old_inserted)
6f2528d8 4198 {
6420e80c
AS
4199 /* Adjust the last undo record for the size change during
4200 the format conversion. */
6f2528d8 4201 Lisp_Object tem = XCAR (old_undo);
6420e80c
AS
4202 if (CONSP (tem) && INTEGERP (XCAR (tem))
4203 && INTEGERP (XCDR (tem))
4204 && XFASTINT (XCDR (tem)) == PT + old_inserted)
4205 XSETCDR (tem, make_number (PT + inserted));
6f2528d8
MR
4206 }
4207 }
6f2528d8 4208 else
1bc99c9c 4209 /* If undo_list was Qt before, keep it that way.
6420e80c 4210 Otherwise start with an empty undo_list. */
4b4deea2 4211 BVAR (current_buffer, undo_list) = EQ (old_undo, Qt) ? Qt : Qnil;
efdc16c9 4212
f839df0c 4213 unbind_to (count1, Qnil);
0d420e88
BG
4214 }
4215
0342d8c5
RS
4216 /* Call after-change hooks for the inserted text, aside from the case
4217 of normal visiting (not with REPLACE), which is done in a new buffer
4218 "before" the buffer is changed. */
c8a6d68a 4219 if (inserted > 0 && total > 0
0342d8c5 4220 && (NILP (visit) || !NILP (replace)))
ce51c54c
KH
4221 {
4222 signal_after_change (PT, 0, inserted);
4223 update_compositions (PT, PT, CHECK_BORDER);
4224 }
b56567b5 4225
f8569325
DL
4226 if (!NILP (visit)
4227 && current_buffer->modtime == -1)
4228 {
4229 /* If visiting nonexistent file, return nil. */
4230 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
d6a3cc15
RS
4231 }
4232
1b978129
GM
4233 if (read_quit)
4234 Fsignal (Qquit, Qnil);
4235
ec7adf26 4236 /* ??? Retval needs to be dealt with in all cases consistently. */
a1d2b64a 4237 if (NILP (val))
b1d1b865 4238 val = Fcons (orig_filename,
a1d2b64a
RS
4239 Fcons (make_number (inserted),
4240 Qnil));
4241
4242 RETURN_UNGCPRO (unbind_to (count, val));
570d7624 4243}
7fded690 4244\f
f57e2426 4245static Lisp_Object build_annotations (Lisp_Object, Lisp_Object);
d6a3cc15 4246
199607e4 4247static Lisp_Object
971de7fb 4248build_annotations_unwind (Lisp_Object arg)
6fc6f94b 4249{
67fbc0cb 4250 Vwrite_region_annotation_buffers = arg;
6fc6f94b
RS
4251 return Qnil;
4252}
4253
7c82a4a9
SM
4254/* Decide the coding-system to encode the data with. */
4255
c934586d 4256static Lisp_Object
dd4c5104
DN
4257choose_write_coding_system (Lisp_Object start, Lisp_Object end, Lisp_Object filename,
4258 Lisp_Object append, Lisp_Object visit, Lisp_Object lockname,
4259 struct coding_system *coding)
7c82a4a9
SM
4260{
4261 Lisp_Object val;
75421805 4262 Lisp_Object eol_parent = Qnil;
7c82a4a9 4263
6b61353c 4264 if (auto_saving
4b4deea2
TT
4265 && NILP (Fstring_equal (BVAR (current_buffer, filename),
4266 BVAR (current_buffer, auto_save_file_name))))
75421805
KH
4267 {
4268 val = Qutf_8_emacs;
4269 eol_parent = Qunix;
4270 }
7c82a4a9 4271 else if (!NILP (Vcoding_system_for_write))
42b01e1e
KH
4272 {
4273 val = Vcoding_system_for_write;
4274 if (coding_system_require_warning
4275 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4276 /* Confirm that VAL can surely encode the current region. */
4277 val = call5 (Vselect_safe_coding_system_function,
4278 start, end, Fcons (Qt, Fcons (val, Qnil)),
4279 Qnil, filename);
4280 }
7c82a4a9
SM
4281 else
4282 {
4283 /* If the variable `buffer-file-coding-system' is set locally,
4284 it means that the file was read with some kind of code
4285 conversion or the variable is explicitly set by users. We
4286 had better write it out with the same coding system even if
4287 `enable-multibyte-characters' is nil.
4288
4289 If it is not set locally, we anyway have to convert EOL
4290 format if the default value of `buffer-file-coding-system'
4291 tells that it is not Unix-like (LF only) format. */
4292 int using_default_coding = 0;
4293 int force_raw_text = 0;
4294
4b4deea2 4295 val = BVAR (current_buffer, buffer_file_coding_system);
7c82a4a9
SM
4296 if (NILP (val)
4297 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
4298 {
4299 val = Qnil;
4b4deea2 4300 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
7c82a4a9
SM
4301 force_raw_text = 1;
4302 }
efdc16c9 4303
7c82a4a9
SM
4304 if (NILP (val))
4305 {
4306 /* Check file-coding-system-alist. */
4307 Lisp_Object args[7], coding_systems;
4308
4309 args[0] = Qwrite_region; args[1] = start; args[2] = end;
4310 args[3] = filename; args[4] = append; args[5] = visit;
4311 args[6] = lockname;
4312 coding_systems = Ffind_operation_coding_system (7, args);
4313 if (CONSP (coding_systems) && !NILP (XCDR (coding_systems)))
4314 val = XCDR (coding_systems);
4315 }
4316
c934586d 4317 if (NILP (val))
7c82a4a9
SM
4318 {
4319 /* If we still have not decided a coding system, use the
4320 default value of buffer-file-coding-system. */
4b4deea2 4321 val = BVAR (current_buffer, buffer_file_coding_system);
7c82a4a9
SM
4322 using_default_coding = 1;
4323 }
efdc16c9 4324
db327c7e
KH
4325 if (! NILP (val) && ! force_raw_text)
4326 {
4327 Lisp_Object spec, attrs;
4328
4329 CHECK_CODING_SYSTEM_GET_SPEC (val, spec);
4330 attrs = AREF (spec, 0);
4331 if (EQ (CODING_ATTR_TYPE (attrs), Qraw_text))
4332 force_raw_text = 1;
4333 }
4334
7c82a4a9
SM
4335 if (!force_raw_text
4336 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4337 /* Confirm that VAL can surely encode the current region. */
905a4276
PJ
4338 val = call5 (Vselect_safe_coding_system_function,
4339 start, end, val, Qnil, filename);
7c82a4a9 4340
db327c7e
KH
4341 /* If the decided coding-system doesn't specify end-of-line
4342 format, we use that of
4343 `default-buffer-file-coding-system'. */
c934586d 4344 if (! using_default_coding
4b4deea2 4345 && ! NILP (BVAR (&buffer_defaults, buffer_file_coding_system)))
db327c7e 4346 val = (coding_inherit_eol_type
4b4deea2 4347 (val, BVAR (&buffer_defaults, buffer_file_coding_system)));
7c82a4a9 4348
db327c7e
KH
4349 /* If we decide not to encode text, use `raw-text' or one of its
4350 subsidiaries. */
7c82a4a9 4351 if (force_raw_text)
db327c7e 4352 val = raw_text_coding_system (val);
7c82a4a9
SM
4353 }
4354
75421805 4355 val = coding_inherit_eol_type (val, eol_parent);
c934586d 4356 setup_coding_system (val, coding);
7c82a4a9 4357
4b4deea2 4358 if (!STRINGP (start) && !NILP (BVAR (current_buffer, selective_display)))
7c82a4a9 4359 coding->mode |= CODING_MODE_SELECTIVE_DISPLAY;
c934586d 4360 return val;
7c82a4a9
SM
4361}
4362
a7ca3326 4363DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 7,
8c1a1077
PJ
4364 "r\nFWrite region to file: \ni\ni\ni\np",
4365 doc: /* Write current region into specified file.
c2efea25
RS
4366When called from a program, requires three arguments:
4367START, END and FILENAME. START and END are normally buffer positions
4368specifying the part of the buffer to write.
4369If START is nil, that means to use the entire buffer contents.
4370If START is a string, then output that string to the file
4371instead of any buffer contents; END is ignored.
4372
8c1a1077
PJ
4373Optional fourth argument APPEND if non-nil means
4374 append to existing file contents (if any). If it is an integer,
4375 seek to that offset in the file before writing.
36e50520 4376Optional fifth argument VISIT, if t or a string, means
8c1a1077
PJ
4377 set the last-save-file-modtime of buffer to this file's modtime
4378 and mark buffer not modified.
4379If VISIT is a string, it is a second file name;
4380 the output goes to FILENAME, but the buffer is marked as visiting VISIT.
4381 VISIT is also the file name to lock and unlock for clash detection.
4382If VISIT is neither t nor nil nor a string,
5f4e6aa9 4383 that means do not display the \"Wrote file\" message.
8c1a1077
PJ
4384The optional sixth arg LOCKNAME, if non-nil, specifies the name to
4385 use for locking and unlocking, overriding FILENAME and VISIT.
4386The optional seventh arg MUSTBENEW, if non-nil, insists on a check
4387 for an existing file with the same name. If MUSTBENEW is `excl',
4388 that means to get an error if the file already exists; never overwrite.
4389 If MUSTBENEW is neither nil nor `excl', that means ask for
4390 confirmation before overwriting, but do go ahead and overwrite the file
4391 if the user confirms.
8c1a1077
PJ
4392
4393This does code conversion according to the value of
4394`coding-system-for-write', `buffer-file-coding-system', or
4395`file-coding-system-alist', and sets the variable
aacd8ba1
GM
4396`last-coding-system-used' to the coding system actually used.
4397
4398This calls `write-region-annotate-functions' at the start, and
4399`write-region-post-annotation-function' at the end. */)
5842a27b 4400 (Lisp_Object start, Lisp_Object end, Lisp_Object filename, Lisp_Object append, Lisp_Object visit, Lisp_Object lockname, Lisp_Object mustbenew)
570d7624
JB
4401{
4402 register int desc;
4403 int failure;
6bbd7a29 4404 int save_errno = 0;
5976c3fe 4405 const char *fn;
570d7624 4406 struct stat st;
aed13378 4407 int count = SPECPDL_INDEX ();
6fc6f94b 4408 int count1;
3eac9910 4409 Lisp_Object handler;
4ad827c5 4410 Lisp_Object visit_file;
65b7d3e7 4411 Lisp_Object annotations;
b1d1b865 4412 Lisp_Object encoded_filename;
d3a67486
SM
4413 int visiting = (EQ (visit, Qt) || STRINGP (visit));
4414 int quietly = !NILP (visit);
7204a979 4415 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
6fc6f94b 4416 struct buffer *given_buffer;
6fdaa9a0 4417 struct coding_system coding;
570d7624 4418
d3a67486 4419 if (current_buffer->base_buffer && visiting)
95385625
RS
4420 error ("Cannot do file visiting in an indirect buffer");
4421
561cb8e1 4422 if (!NILP (start) && !STRINGP (start))
570d7624
JB
4423 validate_region (&start, &end);
4424
95c1c901 4425 visit_file = Qnil;
59fac292 4426 GCPRO5 (start, filename, visit, visit_file, lockname);
b56567b5 4427
570d7624 4428 filename = Fexpand_file_name (filename, Qnil);
de1d0127 4429
236a12f2 4430 if (!NILP (mustbenew) && !EQ (mustbenew, Qexcl))
b8b29dc9 4431 barf_or_query_if_file_exists (filename, "overwrite", 1, 0, 1);
de1d0127 4432
561cb8e1 4433 if (STRINGP (visit))
e5176bae 4434 visit_file = Fexpand_file_name (visit, Qnil);
4ad827c5
RS
4435 else
4436 visit_file = filename;
4437
7204a979
RS
4438 if (NILP (lockname))
4439 lockname = visit_file;
4440
65b7d3e7
RS
4441 annotations = Qnil;
4442
32f4334d
RS
4443 /* If the file name has special constructs in it,
4444 call the corresponding file handler. */
49307295 4445 handler = Ffind_file_name_handler (filename, Qwrite_region);
b56ad927 4446 /* If FILENAME has no handler, see if VISIT has one. */
93c30b5f 4447 if (NILP (handler) && STRINGP (visit))
199607e4 4448 handler = Ffind_file_name_handler (visit, Qwrite_region);
3eac9910 4449
32f4334d
RS
4450 if (!NILP (handler))
4451 {
32f4334d 4452 Lisp_Object val;
51cf6d37
RS
4453 val = call6 (handler, Qwrite_region, start, end,
4454 filename, append, visit);
32f4334d 4455
d6a3cc15 4456 if (visiting)
32f4334d 4457 {
95385625 4458 SAVE_MODIFF = MODIFF;
4b4deea2
TT
4459 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4460 BVAR (current_buffer, filename) = visit_file;
32f4334d 4461 }
09121adc 4462 UNGCPRO;
32f4334d
RS
4463 return val;
4464 }
4465
4a38de71
KH
4466 record_unwind_protect (save_restriction_restore, save_restriction_save ());
4467
561cb8e1
RS
4468 /* Special kludge to simplify auto-saving. */
4469 if (NILP (start))
4470 {
6b3d752c
SM
4471 /* Do it later, so write-region-annotate-function can work differently
4472 if we save "the buffer" vs "a region".
4473 This is useful in tar-mode. --Stef
2acfd7ae 4474 XSETFASTINT (start, BEG);
6b3d752c 4475 XSETFASTINT (end, Z); */
4a38de71 4476 Fwiden ();
561cb8e1
RS
4477 }
4478
67fbc0cb
CY
4479 record_unwind_protect (build_annotations_unwind,
4480 Vwrite_region_annotation_buffers);
4481 Vwrite_region_annotation_buffers = Fcons (Fcurrent_buffer (), Qnil);
aed13378 4482 count1 = SPECPDL_INDEX ();
6fc6f94b
RS
4483
4484 given_buffer = current_buffer;
bf3428a1
RS
4485
4486 if (!STRINGP (start))
236a12f2 4487 {
bf3428a1
RS
4488 annotations = build_annotations (start, end);
4489
4490 if (current_buffer != given_buffer)
4491 {
4492 XSETFASTINT (start, BEGV);
4493 XSETFASTINT (end, ZV);
4494 }
236a12f2
SM
4495 }
4496
6b3d752c
SM
4497 if (NILP (start))
4498 {
4499 XSETFASTINT (start, BEGV);
4500 XSETFASTINT (end, ZV);
4501 }
4502
236a12f2
SM
4503 UNGCPRO;
4504
4505 GCPRO5 (start, filename, annotations, visit_file, lockname);
4506
59fac292
SM
4507 /* Decide the coding-system to encode the data with.
4508 We used to make this choice before calling build_annotations, but that
4509 leads to problems when a write-annotate-function takes care of
4510 unsavable chars (as was the case with X-Symbol). */
c934586d
KH
4511 Vlast_coding_system_used
4512 = choose_write_coding_system (start, end, filename,
4513 append, visit, lockname, &coding);
d6a3cc15 4514
570d7624
JB
4515#ifdef CLASH_DETECTION
4516 if (!auto_saving)
67fbc0cb 4517 lock_file (lockname);
570d7624
JB
4518#endif /* CLASH_DETECTION */
4519
b1d1b865
RS
4520 encoded_filename = ENCODE_FILE (filename);
4521
5976c3fe 4522 fn = SSDATA (encoded_filename);
570d7624 4523 desc = -1;
265a9e55 4524 if (!NILP (append))
5e570b75 4525#ifdef DOS_NT
05c65251 4526 desc = emacs_open (fn, O_WRONLY | O_BINARY, 0);
5e570b75 4527#else /* not DOS_NT */
68c45bf0 4528 desc = emacs_open (fn, O_WRONLY, 0);
5e570b75 4529#endif /* not DOS_NT */
570d7624 4530
b1d1b865 4531 if (desc < 0 && (NILP (append) || errno == ENOENT))
5e570b75 4532#ifdef DOS_NT
68c45bf0 4533 desc = emacs_open (fn,
05c65251 4534 O_WRONLY | O_CREAT | O_BINARY
95522746 4535 | (EQ (mustbenew, Qexcl) ? O_EXCL : O_TRUNC),
68c45bf0 4536 S_IREAD | S_IWRITE);
5e570b75 4537#else /* not DOS_NT */
68c45bf0 4538 desc = emacs_open (fn, O_WRONLY | O_TRUNC | O_CREAT
7c752c80 4539 | (EQ (mustbenew, Qexcl) ? O_EXCL : 0),
68c45bf0 4540 auto_saving ? auto_save_mode_bits : 0666);
5e570b75 4541#endif /* not DOS_NT */
570d7624
JB
4542
4543 if (desc < 0)
4544 {
4545#ifdef CLASH_DETECTION
4546 save_errno = errno;
7204a979 4547 if (!auto_saving) unlock_file (lockname);
570d7624
JB
4548 errno = save_errno;
4549#endif /* CLASH_DETECTION */
43fb7d9a 4550 UNGCPRO;
570d7624
JB
4551 report_file_error ("Opening output file", Fcons (filename, Qnil));
4552 }
4553
4554 record_unwind_protect (close_file_unwind, make_number (desc));
4555
c1c4693e 4556 if (!NILP (append) && !NILP (Ffile_regular_p (filename)))
43fb7d9a
DL
4557 {
4558 long ret;
efdc16c9 4559
43fb7d9a 4560 if (NUMBERP (append))
e69dafad 4561 ret = emacs_lseek (desc, XINT (append), SEEK_CUR);
43fb7d9a 4562 else
e69dafad 4563 ret = lseek (desc, 0, SEEK_END);
43fb7d9a
DL
4564 if (ret < 0)
4565 {
570d7624 4566#ifdef CLASH_DETECTION
43fb7d9a 4567 if (!auto_saving) unlock_file (lockname);
570d7624 4568#endif /* CLASH_DETECTION */
43fb7d9a
DL
4569 UNGCPRO;
4570 report_file_error ("Lseek error", Fcons (filename, Qnil));
4571 }
4572 }
efdc16c9 4573
43fb7d9a 4574 UNGCPRO;
570d7624 4575
570d7624
JB
4576 failure = 0;
4577 immediate_quit = 1;
4578
561cb8e1 4579 if (STRINGP (start))
570d7624 4580 {
d5db4077 4581 failure = 0 > a_write (desc, start, 0, SCHARS (start),
ce51c54c 4582 &annotations, &coding);
570d7624
JB
4583 save_errno = errno;
4584 }
4585 else if (XINT (start) != XINT (end))
4586 {
db327c7e
KH
4587 failure = 0 > a_write (desc, Qnil,
4588 XINT (start), XINT (end) - XINT (start),
4589 &annotations, &coding);
4590 save_errno = errno;
69f6e679
RS
4591 }
4592 else
4593 {
4594 /* If file was empty, still need to write the annotations */
c8a6d68a 4595 coding.mode |= CODING_MODE_LAST_BLOCK;
ce51c54c 4596 failure = 0 > a_write (desc, Qnil, XINT (end), 0, &annotations, &coding);
6fdaa9a0
KH
4597 save_errno = errno;
4598 }
4599
c8a6d68a
KH
4600 if (CODING_REQUIRE_FLUSHING (&coding)
4601 && !(coding.mode & CODING_MODE_LAST_BLOCK)
1354debd 4602 && ! failure)
6fdaa9a0
KH
4603 {
4604 /* We have to flush out a data. */
c8a6d68a 4605 coding.mode |= CODING_MODE_LAST_BLOCK;
db327c7e 4606 failure = 0 > e_write (desc, Qnil, 1, 1, &coding);
69f6e679 4607 save_errno = errno;
570d7624
JB
4608 }
4609
4610 immediate_quit = 0;
4611
6e23c83e 4612#ifdef HAVE_FSYNC
570d7624
JB
4613 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun).
4614 Disk full in NFS may be reported here. */
1daffa1c
RS
4615 /* mib says that closing the file will try to write as fast as NFS can do
4616 it, and that means the fsync here is not crucial for autosave files. */
ccf61795 4617 if (!auto_saving && !write_region_inhibit_fsync && fsync (desc) < 0)
cb33c142 4618 {
6cff77fd
AS
4619 /* If fsync fails with EINTR, don't treat that as serious. Also
4620 ignore EINVAL which happens when fsync is not supported on this
4621 file. */
4622 if (errno != EINTR && errno != EINVAL)
cb33c142
KH
4623 failure = 1, save_errno = errno;
4624 }
570d7624
JB
4625#endif
4626
570d7624 4627 /* NFS can report a write failure now. */
68c45bf0 4628 if (emacs_close (desc) < 0)
570d7624
JB
4629 failure = 1, save_errno = errno;
4630
570d7624 4631 stat (fn, &st);
67fbc0cb 4632
6fc6f94b
RS
4633 /* Discard the unwind protect for close_file_unwind. */
4634 specpdl_ptr = specpdl + count1;
67fbc0cb
CY
4635
4636 /* Call write-region-post-annotation-function. */
294fa707 4637 while (CONSP (Vwrite_region_annotation_buffers))
67fbc0cb
CY
4638 {
4639 Lisp_Object buf = XCAR (Vwrite_region_annotation_buffers);
4640 if (!NILP (Fbuffer_live_p (buf)))
4641 {
4642 Fset_buffer (buf);
4643 if (FUNCTIONP (Vwrite_region_post_annotation_function))
4644 call0 (Vwrite_region_post_annotation_function);
4645 }
4646 Vwrite_region_annotation_buffers
4647 = XCDR (Vwrite_region_annotation_buffers);
4648 }
4649
4650 unbind_to (count, Qnil);
570d7624
JB
4651
4652#ifdef CLASH_DETECTION
4653 if (!auto_saving)
7204a979 4654 unlock_file (lockname);
570d7624
JB
4655#endif /* CLASH_DETECTION */
4656
4657 /* Do this before reporting IO error
4658 to avoid a "file has changed on disk" warning on
4659 next attempt to save. */
d6a3cc15 4660 if (visiting)
58b963f7
SM
4661 {
4662 current_buffer->modtime = st.st_mtime;
4663 current_buffer->modtime_size = st.st_size;
4664 }
570d7624
JB
4665
4666 if (failure)
d5db4077 4667 error ("IO error writing %s: %s", SDATA (filename),
68c45bf0 4668 emacs_strerror (save_errno));
570d7624 4669
d6a3cc15 4670 if (visiting)
570d7624 4671 {
95385625 4672 SAVE_MODIFF = MODIFF;
4b4deea2
TT
4673 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
4674 BVAR (current_buffer, filename) = visit_file;
f4226e89 4675 update_mode_lines++;
570d7624 4676 }
d6a3cc15 4677 else if (quietly)
6b61353c
KH
4678 {
4679 if (auto_saving
4b4deea2
TT
4680 && ! NILP (Fstring_equal (BVAR (current_buffer, filename),
4681 BVAR (current_buffer, auto_save_file_name))))
6b61353c
KH
4682 SAVE_MODIFF = MODIFF;
4683
4684 return Qnil;
4685 }
570d7624
JB
4686
4687 if (!auto_saving)
6b61353c 4688 message_with_string ((INTEGERP (append)
0c328a0e
RS
4689 ? "Updated %s"
4690 : ! NILP (append)
4691 ? "Added to %s"
4692 : "Wrote %s"),
4693 visit_file, 1);
570d7624
JB
4694
4695 return Qnil;
4696}
ec7adf26 4697\f
dd4c5104 4698Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
d6a3cc15
RS
4699
4700DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0,
8c1a1077 4701 doc: /* Return t if (car A) is numerically less than (car B). */)
5842a27b 4702 (Lisp_Object a, Lisp_Object b)
d6a3cc15
RS
4703{
4704 return Flss (Fcar (a), Fcar (b));
4705}
4706
4707/* Build the complete list of annotations appropriate for writing out
4708 the text between START and END, by calling all the functions in
6fc6f94b
RS
4709 write-region-annotate-functions and merging the lists they return.
4710 If one of these functions switches to a different buffer, we assume
4711 that buffer contains altered text. Therefore, the caller must
4712 make sure to restore the current buffer in all cases,
4713 as save-excursion would do. */
d6a3cc15
RS
4714
4715static Lisp_Object
971de7fb 4716build_annotations (Lisp_Object start, Lisp_Object end)
d6a3cc15
RS
4717{
4718 Lisp_Object annotations;
4719 Lisp_Object p, res;
4720 struct gcpro gcpro1, gcpro2;
0a20b684 4721 Lisp_Object original_buffer;
bd235610 4722 int i, used_global = 0;
0a20b684
RS
4723
4724 XSETBUFFER (original_buffer, current_buffer);
d6a3cc15
RS
4725
4726 annotations = Qnil;
4727 p = Vwrite_region_annotate_functions;
4728 GCPRO2 (annotations, p);
28c3eb5a 4729 while (CONSP (p))
d6a3cc15 4730 {
6fc6f94b 4731 struct buffer *given_buffer = current_buffer;
bd235610
SM
4732 if (EQ (Qt, XCAR (p)) && !used_global)
4733 { /* Use the global value of the hook. */
4734 Lisp_Object arg[2];
4735 used_global = 1;
4736 arg[0] = Fdefault_value (Qwrite_region_annotate_functions);
4737 arg[1] = XCDR (p);
4738 p = Fappend (2, arg);
4739 continue;
4740 }
6fc6f94b 4741 Vwrite_region_annotations_so_far = annotations;
28c3eb5a 4742 res = call2 (XCAR (p), start, end);
6fc6f94b
RS
4743 /* If the function makes a different buffer current,
4744 assume that means this buffer contains altered text to be output.
4745 Reset START and END from the buffer bounds
4746 and discard all previous annotations because they should have
4747 been dealt with by this function. */
4748 if (current_buffer != given_buffer)
4749 {
67fbc0cb
CY
4750 Vwrite_region_annotation_buffers
4751 = Fcons (Fcurrent_buffer (),
4752 Vwrite_region_annotation_buffers);
3cf29f61
RS
4753 XSETFASTINT (start, BEGV);
4754 XSETFASTINT (end, ZV);
6fc6f94b
RS
4755 annotations = Qnil;
4756 }
d6a3cc15
RS
4757 Flength (res); /* Check basic validity of return value */
4758 annotations = merge (annotations, res, Qcar_less_than_car);
28c3eb5a 4759 p = XCDR (p);
d6a3cc15 4760 }
0d420e88
BG
4761
4762 /* Now do the same for annotation functions implied by the file-format */
4b4deea2
TT
4763 if (auto_saving && (!EQ (BVAR (current_buffer, auto_save_file_format), Qt)))
4764 p = BVAR (current_buffer, auto_save_file_format);
0d420e88 4765 else
4b4deea2 4766 p = BVAR (current_buffer, file_format);
28c3eb5a 4767 for (i = 0; CONSP (p); p = XCDR (p), ++i)
0d420e88
BG
4768 {
4769 struct buffer *given_buffer = current_buffer;
efdc16c9 4770
0d420e88 4771 Vwrite_region_annotations_so_far = annotations;
532ed661
GM
4772
4773 /* Value is either a list of annotations or nil if the function
4774 has written annotations to a temporary buffer, which is now
4775 current. */
28c3eb5a 4776 res = call5 (Qformat_annotate_function, XCAR (p), start, end,
532ed661 4777 original_buffer, make_number (i));
0d420e88
BG
4778 if (current_buffer != given_buffer)
4779 {
3cf29f61
RS
4780 XSETFASTINT (start, BEGV);
4781 XSETFASTINT (end, ZV);
0d420e88
BG
4782 annotations = Qnil;
4783 }
efdc16c9 4784
532ed661
GM
4785 if (CONSP (res))
4786 annotations = merge (annotations, res, Qcar_less_than_car);
0d420e88 4787 }
6fdaa9a0 4788
236a12f2
SM
4789 UNGCPRO;
4790 return annotations;
4791}
4792
ec7adf26 4793\f
ce51c54c
KH
4794/* Write to descriptor DESC the NCHARS chars starting at POS of STRING.
4795 If STRING is nil, POS is the character position in the current buffer.
d6a3cc15 4796 Intersperse with them the annotations from *ANNOT
ce51c54c 4797 which fall within the range of POS to POS + NCHARS,
d6a3cc15
RS
4798 each at its appropriate position.
4799
ec7adf26
RS
4800 We modify *ANNOT by discarding elements as we use them up.
4801
d6a3cc15
RS
4802 The return value is negative in case of system call failure. */
4803
ec7adf26 4804static int
8a2cbd72
EZ
4805a_write (int desc, Lisp_Object string, EMACS_INT pos,
4806 register EMACS_INT nchars, Lisp_Object *annot,
4807 struct coding_system *coding)
d6a3cc15
RS
4808{
4809 Lisp_Object tem;
8a2cbd72
EZ
4810 EMACS_INT nextpos;
4811 EMACS_INT lastpos = pos + nchars;
d6a3cc15 4812
eb15aa18 4813 while (NILP (*annot) || CONSP (*annot))
d6a3cc15
RS
4814 {
4815 tem = Fcar_safe (Fcar (*annot));
ce51c54c 4816 nextpos = pos - 1;
ec7adf26 4817 if (INTEGERP (tem))
ce51c54c 4818 nextpos = XFASTINT (tem);
ec7adf26
RS
4819
4820 /* If there are no more annotations in this range,
4821 output the rest of the range all at once. */
ce51c54c
KH
4822 if (! (nextpos >= pos && nextpos <= lastpos))
4823 return e_write (desc, string, pos, lastpos, coding);
ec7adf26
RS
4824
4825 /* Output buffer text up to the next annotation's position. */
ce51c54c 4826 if (nextpos > pos)
d6a3cc15 4827 {
055a28c9 4828 if (0 > e_write (desc, string, pos, nextpos, coding))
d6a3cc15 4829 return -1;
ce51c54c 4830 pos = nextpos;
d6a3cc15 4831 }
ec7adf26 4832 /* Output the annotation. */
d6a3cc15
RS
4833 tem = Fcdr (Fcar (*annot));
4834 if (STRINGP (tem))
4835 {
d5db4077 4836 if (0 > e_write (desc, tem, 0, SCHARS (tem), coding))
d6a3cc15
RS
4837 return -1;
4838 }
4839 *annot = Fcdr (*annot);
4840 }
dfcf069d 4841 return 0;
d6a3cc15
RS
4842}
4843
6fdaa9a0 4844
ce51c54c
KH
4845/* Write text in the range START and END into descriptor DESC,
4846 encoding them with coding system CODING. If STRING is nil, START
4847 and END are character positions of the current buffer, else they
4848 are indexes to the string STRING. */
ec7adf26
RS
4849
4850static int
8a2cbd72
EZ
4851e_write (int desc, Lisp_Object string, EMACS_INT start, EMACS_INT end,
4852 struct coding_system *coding)
570d7624 4853{
ce51c54c
KH
4854 if (STRINGP (string))
4855 {
db327c7e 4856 start = 0;
8f924df7 4857 end = SCHARS (string);
ce51c54c 4858 }
570d7624 4859
6fdaa9a0
KH
4860 /* We used to have a code for handling selective display here. But,
4861 now it is handled within encode_coding. */
01ca97a2
KH
4862
4863 while (start < end)
570d7624 4864 {
01ca97a2 4865 if (STRINGP (string))
6ad568dd 4866 {
01ca97a2
KH
4867 coding->src_multibyte = SCHARS (string) < SBYTES (string);
4868 if (CODING_REQUIRE_ENCODING (coding))
4869 {
4870 encode_coding_object (coding, string,
4871 start, string_char_to_byte (string, start),
4872 end, string_char_to_byte (string, end), Qt);
4873 }
4874 else
4875 {
4876 coding->dst_object = string;
4877 coding->consumed_char = SCHARS (string);
4878 coding->produced = SBYTES (string);
4879 }
6ad568dd 4880 }
db327c7e 4881 else
6ad568dd 4882 {
8a2cbd72
EZ
4883 EMACS_INT start_byte = CHAR_TO_BYTE (start);
4884 EMACS_INT end_byte = CHAR_TO_BYTE (end);
b4132433 4885
01ca97a2
KH
4886 coding->src_multibyte = (end - start) < (end_byte - start_byte);
4887 if (CODING_REQUIRE_ENCODING (coding))
4888 {
4889 encode_coding_object (coding, Fcurrent_buffer (),
4890 start, start_byte, end, end_byte, Qt);
4891 }
4892 else
4893 {
4894 coding->dst_object = Qnil;
4895 coding->dst_pos_byte = start_byte;
4896 if (start >= GPT || end <= GPT)
4897 {
4898 coding->consumed_char = end - start;
4899 coding->produced = end_byte - start_byte;
4900 }
4901 else
4902 {
4903 coding->consumed_char = GPT - start;
4904 coding->produced = GPT_BYTE - start_byte;
4905 }
4906 }
c185d744 4907 }
01ca97a2
KH
4908
4909 if (coding->produced > 0)
c185d744 4910 {
01ca97a2
KH
4911 coding->produced -=
4912 emacs_write (desc,
4913 STRINGP (coding->dst_object)
42a5b22f
PE
4914 ? SSDATA (coding->dst_object)
4915 : (char *) BYTE_POS_ADDR (coding->dst_pos_byte),
01ca97a2
KH
4916 coding->produced);
4917
4918 if (coding->produced)
4919 return -1;
570d7624 4920 }
01ca97a2 4921 start += coding->consumed_char;
c185d744
KH
4922 }
4923
4924 return 0;
570d7624 4925}
ec7adf26 4926\f
a7ca3326 4927DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime,
ec1b9b17 4928 Sverify_visited_file_modtime, 0, 1, 0,
8c1a1077 4929 doc: /* Return t if last mod time of BUF's visited file matches what BUF records.
6b61353c 4930This means that the file has not been changed since it was visited or saved.
ec1b9b17 4931If BUF is omitted or nil, it defaults to the current buffer.
6b61353c 4932See Info node `(elisp)Modification Time' for more details. */)
5842a27b 4933 (Lisp_Object buf)
570d7624
JB
4934{
4935 struct buffer *b;
4936 struct stat st;
32f4334d 4937 Lisp_Object handler;
b1d1b865 4938 Lisp_Object filename;
570d7624 4939
ec1b9b17
GM
4940 if (NILP (buf))
4941 b = current_buffer;
4942 else
4943 {
4944 CHECK_BUFFER (buf);
4945 b = XBUFFER (buf);
4946 }
570d7624 4947
4b4deea2 4948 if (!STRINGP (BVAR (b, filename))) return Qt;
570d7624
JB
4949 if (b->modtime == 0) return Qt;
4950
32f4334d
RS
4951 /* If the file name has special constructs in it,
4952 call the corresponding file handler. */
4b4deea2 4953 handler = Ffind_file_name_handler (BVAR (b, filename),
49307295 4954 Qverify_visited_file_modtime);
32f4334d 4955 if (!NILP (handler))
09121adc 4956 return call2 (handler, Qverify_visited_file_modtime, buf);
32f4334d 4957
4b4deea2 4958 filename = ENCODE_FILE (BVAR (b, filename));
b1d1b865 4959
42a5b22f 4960 if (stat (SSDATA (filename), &st) < 0)
570d7624
JB
4961 {
4962 /* If the file doesn't exist now and didn't exist before,
4963 we say that it isn't modified, provided the error is a tame one. */
4964 if (errno == ENOENT || errno == EACCES || errno == ENOTDIR)
4965 st.st_mtime = -1;
4966 else
4967 st.st_mtime = 0;
4968 }
58b963f7
SM
4969 if ((st.st_mtime == b->modtime
4970 /* If both are positive, accept them if they are off by one second. */
4971 || (st.st_mtime > 0 && b->modtime > 0
7f9bbdbb 4972 && (st.st_mtime - 1 == b->modtime
58b963f7
SM
4973 || st.st_mtime == b->modtime - 1)))
4974 && (st.st_size == b->modtime_size
4975 || b->modtime_size < 0))
570d7624
JB
4976 return Qt;
4977 return Qnil;
4978}
4979
4980DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime,
8c1a1077
PJ
4981 Sclear_visited_file_modtime, 0, 0, 0,
4982 doc: /* Clear out records of last mod time of visited file.
4983Next attempt to save will certainly not complain of a discrepancy. */)
5842a27b 4984 (void)
570d7624
JB
4985{
4986 current_buffer->modtime = 0;
58b963f7 4987 current_buffer->modtime_size = -1;
570d7624
JB
4988 return Qnil;
4989}
4990
f5d5eccf 4991DEFUN ("visited-file-modtime", Fvisited_file_modtime,
8c1a1077
PJ
4992 Svisited_file_modtime, 0, 0, 0,
4993 doc: /* Return the current buffer's recorded visited file modification time.
e5fcddc8 4994The value is a list of the form (HIGH LOW), like the time values
6b61353c
KH
4995that `file-attributes' returns. If the current buffer has no recorded
4996file modification time, this function returns 0.
4997See Info node `(elisp)Modification Time' for more details. */)
5842a27b 4998 (void)
f5d5eccf 4999{
73ff9d42
RS
5000 if (! current_buffer->modtime)
5001 return make_number (0);
84acfcf0 5002 return make_time (current_buffer->modtime);
f5d5eccf
RS
5003}
5004
570d7624 5005DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime,
8c1a1077
PJ
5006 Sset_visited_file_modtime, 0, 1, 0,
5007 doc: /* Update buffer's recorded modification time from the visited file's time.
5008Useful if the buffer was not read from the file normally
5009or if the file itself has been changed for some known benign reason.
5010An argument specifies the modification time value to use
5011\(instead of that of the visited file), in the form of a list
5012\(HIGH . LOW) or (HIGH LOW). */)
5842a27b 5013 (Lisp_Object time_list)
570d7624 5014{
f5d5eccf 5015 if (!NILP (time_list))
58b963f7 5016 {
be44ca6c 5017 CONS_TO_INTEGER (time_list, time_t, current_buffer->modtime);
58b963f7
SM
5018 current_buffer->modtime_size = -1;
5019 }
f5d5eccf
RS
5020 else
5021 {
5022 register Lisp_Object filename;
5023 struct stat st;
5024 Lisp_Object handler;
570d7624 5025
4b4deea2 5026 filename = Fexpand_file_name (BVAR (current_buffer, filename), Qnil);
32f4334d 5027
f5d5eccf
RS
5028 /* If the file name has special constructs in it,
5029 call the corresponding file handler. */
49307295 5030 handler = Ffind_file_name_handler (filename, Qset_visited_file_modtime);
f5d5eccf 5031 if (!NILP (handler))
caf3c431 5032 /* The handler can find the file name the same way we did. */
76c881b0 5033 return call2 (handler, Qset_visited_file_modtime, Qnil);
b1d1b865
RS
5034
5035 filename = ENCODE_FILE (filename);
5036
42a5b22f 5037 if (stat (SSDATA (filename), &st) >= 0)
58b963f7
SM
5038 {
5039 current_buffer->modtime = st.st_mtime;
5040 current_buffer->modtime_size = st.st_size;
5041 }
f5d5eccf 5042 }
570d7624
JB
5043
5044 return Qnil;
5045}
5046\f
f14b7e14 5047static Lisp_Object
f839df0c 5048auto_save_error (Lisp_Object error_val)
570d7624 5049{
d7f31e22
GM
5050 Lisp_Object args[3], msg;
5051 int i, nbytes;
5052 struct gcpro gcpro1;
dfc22242
KS
5053 char *msgbuf;
5054 USE_SAFE_ALLOCA;
efdc16c9 5055
ca730bf0
CY
5056 auto_save_error_occurred = 1;
5057
385ed61f 5058 ring_bell (XFRAME (selected_frame));
efdc16c9 5059
d7f31e22 5060 args[0] = build_string ("Auto-saving %s: %s");
4b4deea2 5061 args[1] = BVAR (current_buffer, name);
f839df0c 5062 args[2] = Ferror_message_string (error_val);
d7f31e22
GM
5063 msg = Fformat (3, args);
5064 GCPRO1 (msg);
d5db4077 5065 nbytes = SBYTES (msg);
dfc22242 5066 SAFE_ALLOCA (msgbuf, char *, nbytes);
72af86bd 5067 memcpy (msgbuf, SDATA (msg), nbytes);
d7f31e22
GM
5068
5069 for (i = 0; i < 3; ++i)
5070 {
5071 if (i == 0)
dfc22242 5072 message2 (msgbuf, nbytes, STRING_MULTIBYTE (msg));
d7f31e22 5073 else
dfc22242 5074 message2_nolog (msgbuf, nbytes, STRING_MULTIBYTE (msg));
d7f31e22
GM
5075 Fsleep_for (make_number (1), Qnil);
5076 }
5077
e01f7773 5078 SAFE_FREE ();
d7f31e22 5079 UNGCPRO;
570d7624
JB
5080 return Qnil;
5081}
5082
f14b7e14 5083static Lisp_Object
971de7fb 5084auto_save_1 (void)
570d7624 5085{
570d7624 5086 struct stat st;
d4a42098
KS
5087 Lisp_Object modes;
5088
5089 auto_save_mode_bits = 0666;
570d7624
JB
5090
5091 /* Get visited file's mode to become the auto save file's mode. */
4b4deea2 5092 if (! NILP (BVAR (current_buffer, filename)))
d4a42098 5093 {
4b4deea2 5094 if (stat (SSDATA (BVAR (current_buffer, filename)), &st) >= 0)
d4a42098
KS
5095 /* But make sure we can overwrite it later! */
5096 auto_save_mode_bits = st.st_mode | 0600;
4b4deea2 5097 else if ((modes = Ffile_modes (BVAR (current_buffer, filename)),
d4a42098
KS
5098 INTEGERP (modes)))
5099 /* Remote files don't cooperate with stat. */
5100 auto_save_mode_bits = XINT (modes) | 0600;
5101 }
570d7624
JB
5102
5103 return
4b4deea2 5104 Fwrite_region (Qnil, Qnil, BVAR (current_buffer, auto_save_file_name), Qnil,
699b53bc
CY
5105 NILP (Vauto_save_visited_file_name) ? Qlambda : Qt,
5106 Qnil, Qnil);
570d7624
JB
5107}
5108
e54d3b5d 5109static Lisp_Object
971de7fb 5110do_auto_save_unwind (Lisp_Object arg) /* used as unwind-protect function */
410ed5c3 5111
e54d3b5d 5112{
fff7e982 5113 FILE *stream = (FILE *) XSAVE_VALUE (arg)->pointer;
3be3c08e 5114 auto_saving = 0;
fff7e982 5115 if (stream != NULL)
aab12958
YM
5116 {
5117 BLOCK_INPUT;
5118 fclose (stream);
5119 UNBLOCK_INPUT;
5120 }
e54d3b5d
RS
5121 return Qnil;
5122}
5123
a8c828be 5124static Lisp_Object
971de7fb 5125do_auto_save_unwind_1 (Lisp_Object value) /* used as unwind-protect function */
410ed5c3 5126
a8c828be
RS
5127{
5128 minibuffer_auto_raise = XINT (value);
5129 return Qnil;
5130}
5131
5794dd61 5132static Lisp_Object
971de7fb 5133do_auto_save_make_dir (Lisp_Object dir)
5794dd61 5134{
26816cbf
SG
5135 Lisp_Object mode;
5136
5137 call2 (Qmake_directory, dir, Qt);
5138 XSETFASTINT (mode, 0700);
5139 return Fset_file_modes (dir, mode);
5794dd61
RS
5140}
5141
5142static Lisp_Object
971de7fb 5143do_auto_save_eh (Lisp_Object ignore)
5794dd61
RS
5144{
5145 return Qnil;
5146}
5147
a7ca3326 5148DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "",
8c1a1077
PJ
5149 doc: /* Auto-save all buffers that need it.
5150This is all buffers that have auto-saving enabled
5151and are changed since last auto-saved.
5152Auto-saving writes the buffer into a file
5153so that your editing is not lost if the system crashes.
5154This file is not the file you visited; that changes only when you save.
5155Normally we run the normal hook `auto-save-hook' before saving.
5156
5157A non-nil NO-MESSAGE argument means do not print any message if successful.
5158A non-nil CURRENT-ONLY argument means save only current buffer. */)
5842a27b 5159 (Lisp_Object no_message, Lisp_Object current_only)
570d7624
JB
5160{
5161 struct buffer *old = current_buffer, *b;
dee091a3 5162 Lisp_Object tail, buf, hook;
570d7624 5163 int auto_saved = 0;
f14b1c68 5164 int do_handled_files;
ff4c9993 5165 Lisp_Object oquit;
fff7e982 5166 FILE *stream = NULL;
aed13378 5167 int count = SPECPDL_INDEX ();
a8c828be 5168 int orig_minibuffer_auto_raise = minibuffer_auto_raise;
5794dd61 5169 int old_message_p = 0;
d57563b6 5170 struct gcpro gcpro1, gcpro2;
38da540d
RS
5171
5172 if (max_specpdl_size < specpdl_size + 40)
5173 max_specpdl_size = specpdl_size + 40;
5174
5175 if (minibuf_level)
5176 no_message = Qt;
5177
5794dd61
RS
5178 if (NILP (no_message))
5179 {
5180 old_message_p = push_message ();
5181 record_unwind_protect (pop_message_unwind, Qnil);
5182 }
efdc16c9 5183
ff4c9993
RS
5184 /* Ordinarily don't quit within this function,
5185 but don't make it impossible to quit (in case we get hung in I/O). */
5186 oquit = Vquit_flag;
5187 Vquit_flag = Qnil;
570d7624
JB
5188
5189 /* No GCPRO needed, because (when it matters) all Lisp_Object variables
5190 point to non-strings reached from Vbuffer_alist. */
5191
dee091a3
JD
5192 hook = intern ("auto-save-hook");
5193 Frun_hooks (1, &hook);
570d7624 5194
e54d3b5d
RS
5195 if (STRINGP (Vauto_save_list_file_name))
5196 {
0894672f 5197 Lisp_Object listfile;
efdc16c9 5198
258fd2cb 5199 listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
0894672f
GM
5200
5201 /* Don't try to create the directory when shutting down Emacs,
5202 because creating the directory might signal an error, and
5203 that would leave Emacs in a strange state. */
5204 if (!NILP (Vrun_hooks))
5205 {
5206 Lisp_Object dir;
d57563b6
RS
5207 dir = Qnil;
5208 GCPRO2 (dir, listfile);
0894672f
GM
5209 dir = Ffile_name_directory (listfile);
5210 if (NILP (Ffile_directory_p (dir)))
5794dd61
RS
5211 internal_condition_case_1 (do_auto_save_make_dir,
5212 dir, Fcons (Fcons (Qfile_error, Qnil), Qnil),
5213 do_auto_save_eh);
d57563b6 5214 UNGCPRO;
0894672f 5215 }
efdc16c9 5216
42a5b22f 5217 stream = fopen (SSDATA (listfile), "w");
1b335d29 5218 }
199607e4 5219
fff7e982
KS
5220 record_unwind_protect (do_auto_save_unwind,
5221 make_save_value (stream, 0));
a8c828be
RS
5222 record_unwind_protect (do_auto_save_unwind_1,
5223 make_number (minibuffer_auto_raise));
5224 minibuffer_auto_raise = 0;
3be3c08e 5225 auto_saving = 1;
ca730bf0 5226 auto_save_error_occurred = 0;
3be3c08e 5227
6b61353c
KH
5228 /* On first pass, save all files that don't have handlers.
5229 On second pass, save all files that do have handlers.
5230
5231 If Emacs is crashing, the handlers may tweak what is causing
5232 Emacs to crash in the first place, and it would be a shame if
5233 Emacs failed to autosave perfectly ordinary files because it
5234 couldn't handle some ange-ftp'd file. */
5235
f14b1c68 5236 for (do_handled_files = 0; do_handled_files < 2; do_handled_files++)
8e50cc2d 5237 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
f14b1c68 5238 {
03699b14 5239 buf = XCDR (XCAR (tail));
f14b1c68 5240 b = XBUFFER (buf);
199607e4 5241
e54d3b5d 5242 /* Record all the buffers that have auto save mode
258fd2cb
RS
5243 in the special file that lists them. For each of these buffers,
5244 Record visited name (if any) and auto save name. */
4b4deea2 5245 if (STRINGP (BVAR (b, auto_save_file_name))
1b335d29 5246 && stream != NULL && do_handled_files == 0)
e54d3b5d 5247 {
aab12958 5248 BLOCK_INPUT;
4b4deea2 5249 if (!NILP (BVAR (b, filename)))
258fd2cb 5250 {
4b4deea2
TT
5251 fwrite (SDATA (BVAR (b, filename)), 1,
5252 SBYTES (BVAR (b, filename)), stream);
258fd2cb 5253 }
1b335d29 5254 putc ('\n', stream);
4b4deea2
TT
5255 fwrite (SDATA (BVAR (b, auto_save_file_name)), 1,
5256 SBYTES (BVAR (b, auto_save_file_name)), stream);
1b335d29 5257 putc ('\n', stream);
aab12958 5258 UNBLOCK_INPUT;
e54d3b5d 5259 }
17857782 5260
f14b1c68
JB
5261 if (!NILP (current_only)
5262 && b != current_buffer)
5263 continue;
e54d3b5d 5264
95385625
RS
5265 /* Don't auto-save indirect buffers.
5266 The base buffer takes care of it. */
5267 if (b->base_buffer)
5268 continue;
5269
f14b1c68
JB
5270 /* Check for auto save enabled
5271 and file changed since last auto save
5272 and file changed since last real save. */
4b4deea2 5273 if (STRINGP (BVAR (b, auto_save_file_name))
95385625 5274 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
0b5397c2 5275 && BUF_AUTOSAVE_MODIFF (b) < BUF_MODIFF (b)
82c2d839 5276 /* -1 means we've turned off autosaving for a while--see below. */
4b4deea2 5277 && XINT (BVAR (b, save_length)) >= 0
f14b1c68 5278 && (do_handled_files
4b4deea2 5279 || NILP (Ffind_file_name_handler (BVAR (b, auto_save_file_name),
49307295 5280 Qwrite_region))))
f14b1c68 5281 {
b60247d9
RS
5282 EMACS_TIME before_time, after_time;
5283
5284 EMACS_GET_TIME (before_time);
5285
5286 /* If we had a failure, don't try again for 20 minutes. */
5287 if (b->auto_save_failure_time >= 0
5288 && EMACS_SECS (before_time) - b->auto_save_failure_time < 1200)
5289 continue;
5290
090101cf
CY
5291 set_buffer_internal (b);
5292 if (NILP (Vauto_save_include_big_deletions)
4b4deea2 5293 && (XFASTINT (BVAR (b, save_length)) * 10
4be941e3 5294 > (BUF_Z (b) - BUF_BEG (b)) * 13)
f14b1c68
JB
5295 /* A short file is likely to change a large fraction;
5296 spare the user annoying messages. */
4b4deea2 5297 && XFASTINT (BVAR (b, save_length)) > 5000
f14b1c68 5298 /* These messages are frequent and annoying for `*mail*'. */
4b4deea2 5299 && !EQ (BVAR (b, filename), Qnil)
f14b1c68
JB
5300 && NILP (no_message))
5301 {
5302 /* It has shrunk too much; turn off auto-saving here. */
a8c828be 5303 minibuffer_auto_raise = orig_minibuffer_auto_raise;
fd91d0d4 5304 message_with_string ("Buffer %s has shrunk a lot; auto save disabled in that buffer until next real save",
4b4deea2 5305 BVAR (b, name), 1);
a8c828be 5306 minibuffer_auto_raise = 0;
82c2d839
RS
5307 /* Turn off auto-saving until there's a real save,
5308 and prevent any more warnings. */
4b4deea2 5309 XSETINT (BVAR (b, save_length), -1);
f14b1c68
JB
5310 Fsleep_for (make_number (1), Qnil);
5311 continue;
5312 }
f14b1c68
JB
5313 if (!auto_saved && NILP (no_message))
5314 message1 ("Auto-saving...");
5315 internal_condition_case (auto_save_1, Qt, auto_save_error);
5316 auto_saved++;
0b5397c2 5317 BUF_AUTOSAVE_MODIFF (b) = BUF_MODIFF (b);
4b4deea2 5318 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
f14b1c68 5319 set_buffer_internal (old);
b60247d9
RS
5320
5321 EMACS_GET_TIME (after_time);
5322
5323 /* If auto-save took more than 60 seconds,
5324 assume it was an NFS failure that got a timeout. */
5325 if (EMACS_SECS (after_time) - EMACS_SECS (before_time) > 60)
5326 b->auto_save_failure_time = EMACS_SECS (after_time);
f14b1c68
JB
5327 }
5328 }
570d7624 5329
b67f2ca5
RS
5330 /* Prevent another auto save till enough input events come in. */
5331 record_auto_save ();
570d7624 5332
17857782 5333 if (auto_saved && NILP (no_message))
f05b275b 5334 {
5794dd61 5335 if (old_message_p)
31f3d831 5336 {
5794dd61
RS
5337 /* If we are going to restore an old message,
5338 give time to read ours. */
83f8d903 5339 sit_for (make_number (1), 0, 0);
c71106e5 5340 restore_message ();
31f3d831 5341 }
ca730bf0 5342 else if (!auto_save_error_occurred)
31e31a15
CY
5343 /* Don't overwrite the error message if an error occurred.
5344 If we displayed a message and then restored a state
5794dd61 5345 with no message, leave a "done" message on the screen. */
f05b275b
KH
5346 message1 ("Auto-saving...done");
5347 }
570d7624 5348
ff4c9993
RS
5349 Vquit_flag = oquit;
5350
5794dd61 5351 /* This restores the message-stack status. */
e54d3b5d 5352 unbind_to (count, Qnil);
570d7624
JB
5353 return Qnil;
5354}
5355
5356DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved,
8c1a1077
PJ
5357 Sset_buffer_auto_saved, 0, 0, 0,
5358 doc: /* Mark current buffer as auto-saved with its current text.
5359No auto-save file will be written until the buffer changes again. */)
5842a27b 5360 (void)
570d7624 5361{
0b5397c2
SM
5362 /* FIXME: This should not be called in indirect buffers, since
5363 they're not autosaved. */
5364 BUF_AUTOSAVE_MODIFF (current_buffer) = MODIFF;
4b4deea2 5365 XSETFASTINT (BVAR (current_buffer, save_length), Z - BEG);
b60247d9
RS
5366 current_buffer->auto_save_failure_time = -1;
5367 return Qnil;
5368}
5369
5370DEFUN ("clear-buffer-auto-save-failure", Fclear_buffer_auto_save_failure,
8c1a1077
PJ
5371 Sclear_buffer_auto_save_failure, 0, 0, 0,
5372 doc: /* Clear any record of a recent auto-save failure in the current buffer. */)
5842a27b 5373 (void)
b60247d9
RS
5374{
5375 current_buffer->auto_save_failure_time = -1;
570d7624
JB
5376 return Qnil;
5377}
5378
5379DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p,
8c1a1077 5380 0, 0, 0,
68780e2a
RS
5381 doc: /* Return t if current buffer has been auto-saved recently.
5382More precisely, if it has been auto-saved since last read from or saved
5383in the visited file. If the buffer has no visited file,
5384then any auto-save counts as "recent". */)
5842a27b 5385 (void)
570d7624 5386{
0b5397c2
SM
5387 /* FIXME: maybe we should return nil for indirect buffers since
5388 they're never autosaved. */
5389 return (SAVE_MODIFF < BUF_AUTOSAVE_MODIFF (current_buffer) ? Qt : Qnil);
570d7624
JB
5390}
5391\f
5392/* Reading and completing file names */
6e710ae5 5393
88208bb8
JD
5394DEFUN ("next-read-file-uses-dialog-p", Fnext_read_file_uses_dialog_p,
5395 Snext_read_file_uses_dialog_p, 0, 0, 0,
5396 doc: /* Return t if a call to `read-file-name' will use a dialog.
5397The return value is only relevant for a call to `read-file-name' that happens
1a0de25c 5398before any other event (mouse or keypress) is handled. */)
5842a27b 5399 (void)
88208bb8 5400{
9e2a2647 5401#if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK)
88208bb8
JD
5402 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
5403 && use_dialog_box
5404 && use_file_dialog
5405 && have_menus_p ())
5406 return Qt;
5407#endif
5408 return Qnil;
5409}
d4a42098 5410
dbd50d4b 5411Lisp_Object
971de7fb 5412Fread_file_name (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate)
570d7624 5413{
fd4ead52 5414 struct gcpro gcpro1;
dbd50d4b 5415 Lisp_Object args[7];
a79485af 5416
71e1f69d 5417 GCPRO1 (default_filename);
dbd50d4b
SM
5418 args[0] = intern ("read-file-name");
5419 args[1] = prompt;
5420 args[2] = dir;
5421 args[3] = default_filename;
5422 args[4] = mustmatch;
5423 args[5] = initial;
5424 args[6] = predicate;
5425 RETURN_UNGCPRO (Ffuncall (7, args));
570d7624 5426}
9c856db9 5427
570d7624 5428\f
dfcf069d 5429void
971de7fb 5430syms_of_fileio (void)
570d7624 5431{
cd3520a4
JB
5432 DEFSYM (Qoperations, "operations");
5433 DEFSYM (Qexpand_file_name, "expand-file-name");
5434 DEFSYM (Qsubstitute_in_file_name, "substitute-in-file-name");
5435 DEFSYM (Qdirectory_file_name, "directory-file-name");
5436 DEFSYM (Qfile_name_directory, "file-name-directory");
5437 DEFSYM (Qfile_name_nondirectory, "file-name-nondirectory");
5438 DEFSYM (Qunhandled_file_name_directory, "unhandled-file-name-directory");
5439 DEFSYM (Qfile_name_as_directory, "file-name-as-directory");
5440 DEFSYM (Qcopy_file, "copy-file");
5441 DEFSYM (Qmake_directory_internal, "make-directory-internal");
5442 DEFSYM (Qmake_directory, "make-directory");
5443 DEFSYM (Qdelete_directory_internal, "delete-directory-internal");
5444 DEFSYM (Qdelete_file, "delete-file");
5445 DEFSYM (Qrename_file, "rename-file");
5446 DEFSYM (Qadd_name_to_file, "add-name-to-file");
5447 DEFSYM (Qmake_symbolic_link, "make-symbolic-link");
5448 DEFSYM (Qfile_exists_p, "file-exists-p");
5449 DEFSYM (Qfile_executable_p, "file-executable-p");
5450 DEFSYM (Qfile_readable_p, "file-readable-p");
5451 DEFSYM (Qfile_writable_p, "file-writable-p");
5452 DEFSYM (Qfile_symlink_p, "file-symlink-p");
5453 DEFSYM (Qaccess_file, "access-file");
5454 DEFSYM (Qfile_directory_p, "file-directory-p");
5455 DEFSYM (Qfile_regular_p, "file-regular-p");
5456 DEFSYM (Qfile_accessible_directory_p, "file-accessible-directory-p");
5457 DEFSYM (Qfile_modes, "file-modes");
5458 DEFSYM (Qset_file_modes, "set-file-modes");
5459 DEFSYM (Qset_file_times, "set-file-times");
5460 DEFSYM (Qfile_selinux_context, "file-selinux-context");
5461 DEFSYM (Qset_file_selinux_context, "set-file-selinux-context");
5462 DEFSYM (Qfile_newer_than_file_p, "file-newer-than-file-p");
5463 DEFSYM (Qinsert_file_contents, "insert-file-contents");
5464 DEFSYM (Qwrite_region, "write-region");
5465 DEFSYM (Qverify_visited_file_modtime, "verify-visited-file-modtime");
5466 DEFSYM (Qset_visited_file_modtime, "set-visited-file-modtime");
5467 DEFSYM (Qauto_save_coding, "auto-save-coding");
5468
5469 DEFSYM (Qfile_name_history, "file-name-history");
642ef245 5470 Fset (Qfile_name_history, Qnil);
15c65264 5471
cd3520a4
JB
5472 DEFSYM (Qfile_error, "file-error");
5473 DEFSYM (Qfile_already_exists, "file-already-exists");
5474 DEFSYM (Qfile_date_error, "file-date-error");
5475 DEFSYM (Qexcl, "excl");
570d7624 5476
29208e82 5477 DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system,
8c1a1077 5478 doc: /* *Coding system for encoding file names.
346ebf53 5479If it is nil, `default-file-name-coding-system' (which see) is used. */);
b1d1b865
RS
5480 Vfile_name_coding_system = Qnil;
5481
cd913586 5482 DEFVAR_LISP ("default-file-name-coding-system",
29208e82 5483 Vdefault_file_name_coding_system,
8c1a1077 5484 doc: /* Default coding system for encoding file names.
346ebf53 5485This variable is used only when `file-name-coding-system' is nil.
8c1a1077 5486
346ebf53 5487This variable is set/changed by the command `set-language-environment'.
8c1a1077 5488User should not set this variable manually,
346ebf53 5489instead use `file-name-coding-system' to get a constant encoding
8c1a1077 5490of file names regardless of the current language environment. */);
cd913586
KH
5491 Vdefault_file_name_coding_system = Qnil;
5492
cd3520a4
JB
5493 DEFSYM (Qformat_decode, "format-decode");
5494 DEFSYM (Qformat_annotate_function, "format-annotate-function");
5495 DEFSYM (Qafter_insert_file_set_coding, "after-insert-file-set-coding");
5496 DEFSYM (Qcar_less_than_car, "car-less-than-car");
d6a3cc15 5497
570d7624 5498 Fput (Qfile_error, Qerror_conditions,
d67b4f80 5499 Fpurecopy (list2 (Qfile_error, Qerror)));
570d7624 5500 Fput (Qfile_error, Qerror_message,
d67b4f80 5501 make_pure_c_string ("File error"));
570d7624
JB
5502
5503 Fput (Qfile_already_exists, Qerror_conditions,
d67b4f80 5504 Fpurecopy (list3 (Qfile_already_exists, Qfile_error, Qerror)));
570d7624 5505 Fput (Qfile_already_exists, Qerror_message,
d67b4f80 5506 make_pure_c_string ("File already exists"));
570d7624 5507
c0b7b21c 5508 Fput (Qfile_date_error, Qerror_conditions,
d67b4f80 5509 Fpurecopy (list3 (Qfile_date_error, Qfile_error, Qerror)));
c0b7b21c 5510 Fput (Qfile_date_error, Qerror_message,
d67b4f80 5511 make_pure_c_string ("Cannot set file date"));
c0b7b21c 5512
29208e82 5513 DEFVAR_LISP ("file-name-handler-alist", Vfile_name_handler_alist,
8c1a1077
PJ
5514 doc: /* *Alist of elements (REGEXP . HANDLER) for file names handled specially.
5515If a file name matches REGEXP, then all I/O on that file is done by calling
5516HANDLER.
5517
5518The first argument given to HANDLER is the name of the I/O primitive
5519to be handled; the remaining arguments are the arguments that were
5520passed to that primitive. For example, if you do
5521 (file-exists-p FILENAME)
5522and FILENAME is handled by HANDLER, then HANDLER is called like this:
5523 (funcall HANDLER 'file-exists-p FILENAME)
5524The function `find-file-name-handler' checks this list for a handler
5525for its argument. */);
09121adc
RS
5526 Vfile_name_handler_alist = Qnil;
5527
0414b394 5528 DEFVAR_LISP ("set-auto-coding-function",
29208e82 5529 Vset_auto_coding_function,
8c1a1077
PJ
5530 doc: /* If non-nil, a function to call to decide a coding system of file.
5531Two arguments are passed to this function: the file name
5532and the length of a file contents following the point.
5533This function should return a coding system to decode the file contents.
5534It should check the file name against `auto-coding-alist'.
5535If no coding system is decided, it should check a coding system
5536specified in the heading lines with the format:
5537 -*- ... coding: CODING-SYSTEM; ... -*-
5538or local variable spec of the tailing lines with `coding:' tag. */);
0414b394 5539 Vset_auto_coding_function = Qnil;
c9e82392 5540
29208e82 5541 DEFVAR_LISP ("after-insert-file-functions", Vafter_insert_file_functions,
8c1a1077 5542 doc: /* A list of functions to be called at the end of `insert-file-contents'.
0cf9f5b5
RS
5543Each is passed one argument, the number of characters inserted,
5544with point at the start of the inserted text. Each function
5545should leave point the same, and return the new character count.
cf6d2357
RS
5546If `insert-file-contents' is intercepted by a handler from
5547`file-name-handler-alist', that handler is responsible for calling the
5548functions in `after-insert-file-functions' if appropriate. */);
d6a3cc15
RS
5549 Vafter_insert_file_functions = Qnil;
5550
29208e82 5551 DEFVAR_LISP ("write-region-annotate-functions", Vwrite_region_annotate_functions,
8c1a1077
PJ
5552 doc: /* A list of functions to be called at the start of `write-region'.
5553Each is passed two arguments, START and END as for `write-region'.
5554These are usually two numbers but not always; see the documentation
5555for `write-region'. The function should return a list of pairs
5556of the form (POSITION . STRING), consisting of strings to be effectively
5557inserted at the specified positions of the file being written (1 means to
5558insert before the first byte written). The POSITIONs must be sorted into
67fbc0cb
CY
5559increasing order.
5560
5561If there are several annotation functions, the lists returned by these
5562functions are merged destructively. As each annotation function runs,
5563the variable `write-region-annotations-so-far' contains a list of all
5564annotations returned by previous annotation functions.
5565
5566An annotation function can return with a different buffer current.
5567Doing so removes the annotations returned by previous functions, and
5568resets START and END to `point-min' and `point-max' of the new buffer.
5569
5570After `write-region' completes, Emacs calls the function stored in
5571`write-region-post-annotation-function', once for each buffer that was
5572current when building the annotations (i.e., at least once), with that
5573buffer current. */);
d6a3cc15 5574 Vwrite_region_annotate_functions = Qnil;
cd3520a4 5575 DEFSYM (Qwrite_region_annotate_functions, "write-region-annotate-functions");
d6a3cc15 5576
67fbc0cb 5577 DEFVAR_LISP ("write-region-post-annotation-function",
29208e82 5578 Vwrite_region_post_annotation_function,
67fbc0cb
CY
5579 doc: /* Function to call after `write-region' completes.
5580The function is called with no arguments. If one or more of the
5581annotation functions in `write-region-annotate-functions' changed the
5582current buffer, the function stored in this variable is called for
5583each of those additional buffers as well, in addition to the original
5584buffer. The relevant buffer is current during each function call. */);
5585 Vwrite_region_post_annotation_function = Qnil;
5586 staticpro (&Vwrite_region_annotation_buffers);
5587
6fc6f94b 5588 DEFVAR_LISP ("write-region-annotations-so-far",
29208e82 5589 Vwrite_region_annotations_so_far,
8c1a1077
PJ
5590 doc: /* When an annotation function is called, this holds the previous annotations.
5591These are the annotations made by other annotation functions
5592that were already called. See also `write-region-annotate-functions'. */);
6fc6f94b
RS
5593 Vwrite_region_annotations_so_far = Qnil;
5594
29208e82 5595 DEFVAR_LISP ("inhibit-file-name-handlers", Vinhibit_file_name_handlers,
8c1a1077
PJ
5596 doc: /* A list of file name handlers that temporarily should not be used.
5597This applies only to the operation `inhibit-file-name-operation'. */);
82c2d839
RS
5598 Vinhibit_file_name_handlers = Qnil;
5599
29208e82 5600 DEFVAR_LISP ("inhibit-file-name-operation", Vinhibit_file_name_operation,
8c1a1077 5601 doc: /* The operation for which `inhibit-file-name-handlers' is applicable. */);
a65970a0
RS
5602 Vinhibit_file_name_operation = Qnil;
5603
29208e82 5604 DEFVAR_LISP ("auto-save-list-file-name", Vauto_save_list_file_name,
8c1a1077
PJ
5605 doc: /* File name in which we write a list of all auto save file names.
5606This variable is initialized automatically from `auto-save-list-file-prefix'
5607shortly after Emacs reads your `.emacs' file, if you have not yet given it
5608a non-nil value. */);
e54d3b5d
RS
5609 Vauto_save_list_file_name = Qnil;
5610
29208e82 5611 DEFVAR_LISP ("auto-save-visited-file-name", Vauto_save_visited_file_name,
699b53bc
CY
5612 doc: /* Non-nil says auto-save a buffer in the file it is visiting, when practical.
5613Normally auto-save files are written under other names. */);
5614 Vauto_save_visited_file_name = Qnil;
5615
29208e82 5616 DEFVAR_LISP ("auto-save-include-big-deletions", Vauto_save_include_big_deletions,
090101cf
CY
5617 doc: /* If non-nil, auto-save even if a large part of the text is deleted.
5618If nil, deleting a substantial portion of the text disables auto-save
5619in the buffer; this is the default behavior, because the auto-save
5620file is usually more useful if it contains the deleted text. */);
5621 Vauto_save_include_big_deletions = Qnil;
5622
ccf61795 5623#ifdef HAVE_FSYNC
29208e82 5624 DEFVAR_BOOL ("write-region-inhibit-fsync", write_region_inhibit_fsync,
e3f509dd
RF
5625 doc: /* *Non-nil means don't call fsync in `write-region'.
5626This variable affects calls to `write-region' as well as save commands.
5627A non-nil value may result in data loss! */);
ccf61795
RF
5628 write_region_inhibit_fsync = 0;
5629#endif
5630
29208e82 5631 DEFVAR_BOOL ("delete-by-moving-to-trash", delete_by_moving_to_trash,
6cf29fe8 5632 doc: /* Specifies whether to use the system's trash can.
f1a5d776
CY
5633When non-nil, certain file deletion commands use the function
5634`move-file-to-trash' instead of deleting files outright.
5635This includes interactive calls to `delete-file' and
5636`delete-directory' and the Dired deletion commands. */);
6cf29fe8 5637 delete_by_moving_to_trash = 0;
d67b4f80 5638 Qdelete_by_moving_to_trash = intern_c_string ("delete-by-moving-to-trash");
cd3520a4
JB
5639
5640 DEFSYM (Qmove_file_to_trash, "move-file-to-trash");
5641 DEFSYM (Qcopy_directory, "copy-directory");
5642 DEFSYM (Qdelete_directory, "delete-directory");
6cf29fe8 5643
642ef245 5644 defsubr (&Sfind_file_name_handler);
570d7624
JB
5645 defsubr (&Sfile_name_directory);
5646 defsubr (&Sfile_name_nondirectory);
642ef245 5647 defsubr (&Sunhandled_file_name_directory);
570d7624
JB
5648 defsubr (&Sfile_name_as_directory);
5649 defsubr (&Sdirectory_file_name);
5650 defsubr (&Smake_temp_name);
5651 defsubr (&Sexpand_file_name);
5652 defsubr (&Ssubstitute_in_file_name);
5653 defsubr (&Scopy_file);
9bbe01fb 5654 defsubr (&Smake_directory_internal);
9d8f3bd9 5655 defsubr (&Sdelete_directory_internal);
570d7624
JB
5656 defsubr (&Sdelete_file);
5657 defsubr (&Srename_file);
5658 defsubr (&Sadd_name_to_file);
570d7624 5659 defsubr (&Smake_symbolic_link);
570d7624
JB
5660 defsubr (&Sfile_name_absolute_p);
5661 defsubr (&Sfile_exists_p);
5662 defsubr (&Sfile_executable_p);
5663 defsubr (&Sfile_readable_p);
5664 defsubr (&Sfile_writable_p);
1f8653eb 5665 defsubr (&Saccess_file);
570d7624
JB
5666 defsubr (&Sfile_symlink_p);
5667 defsubr (&Sfile_directory_p);
b72dea2a 5668 defsubr (&Sfile_accessible_directory_p);
f793dc6c 5669 defsubr (&Sfile_regular_p);
570d7624
JB
5670 defsubr (&Sfile_modes);
5671 defsubr (&Sset_file_modes);
819da85b 5672 defsubr (&Sset_file_times);
574c05e2
KK
5673 defsubr (&Sfile_selinux_context);
5674 defsubr (&Sset_file_selinux_context);
c24e9a53
RS
5675 defsubr (&Sset_default_file_modes);
5676 defsubr (&Sdefault_file_modes);
570d7624
JB
5677 defsubr (&Sfile_newer_than_file_p);
5678 defsubr (&Sinsert_file_contents);
5679 defsubr (&Swrite_region);
d6a3cc15 5680 defsubr (&Scar_less_than_car);
570d7624
JB
5681 defsubr (&Sverify_visited_file_modtime);
5682 defsubr (&Sclear_visited_file_modtime);
f5d5eccf 5683 defsubr (&Svisited_file_modtime);
570d7624
JB
5684 defsubr (&Sset_visited_file_modtime);
5685 defsubr (&Sdo_auto_save);
5686 defsubr (&Sset_buffer_auto_saved);
b60247d9 5687 defsubr (&Sclear_buffer_auto_save_failure);
570d7624
JB
5688 defsubr (&Srecent_auto_save_p);
5689
88208bb8 5690 defsubr (&Snext_read_file_uses_dialog_p);
85ffea93 5691
697c17a2 5692#ifdef HAVE_SYNC
85ffea93 5693 defsubr (&Sunix_sync);
483a2e10 5694#endif
570d7624 5695}