1 /* File IO for GNU Emacs.
2 Copyright (C) 1985,86,87,88,93,94,95,96,97,98,99,2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #define _GNU_SOURCE /* for euidaccess */
26 #if defined (USG5) || defined (BSD_SYSTEM) || defined (GNU_LINUX)
31 #include <sys/types.h>
38 #if !defined (S_ISLNK) && defined (S_IFLNK)
39 # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
42 #if !defined (S_ISFIFO) && defined (S_IFIFO)
43 # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
46 #if !defined (S_ISREG) && defined (S_IFREG)
47 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
88 #include "intervals.h"
99 #endif /* not WINDOWSNT */
103 #include <sys/param.h>
111 #define CORRECT_DIR_SEPS(s) \
112 do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
113 else unixtodos_filename (s); \
115 /* On Windows, drive letters must be alphabetic - on DOS, the Netware
116 redirector allows the six letters between 'Z' and 'a' as well. */
118 #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
121 #define IS_DRIVE(x) isalpha (x)
123 /* Need to lower-case the drive letter, or else expanded
124 filenames will sometimes compare inequal, because
125 `expand-file-name' doesn't always down-case the drive letter. */
126 #define DRIVE_LETTER(x) (tolower (x))
147 #include "commands.h"
148 extern int use_dialog_box
;
162 /* Nonzero during writing of auto-save files */
165 /* Set by auto_save_1 to mode of original file so Fwrite_region will create
166 a new file with the same mode as the original */
167 int auto_save_mode_bits
;
169 /* Coding system for file names, or nil if none. */
170 Lisp_Object Vfile_name_coding_system
;
172 /* Coding system for file names used only when
173 Vfile_name_coding_system is nil. */
174 Lisp_Object Vdefault_file_name_coding_system
;
176 /* Alist of elements (REGEXP . HANDLER) for file names
177 whose I/O is done with a special handler. */
178 Lisp_Object Vfile_name_handler_alist
;
180 /* Format for auto-save files */
181 Lisp_Object Vauto_save_file_format
;
183 /* Lisp functions for translating file formats */
184 Lisp_Object Qformat_decode
, Qformat_annotate_function
;
186 /* Function to be called to decide a coding system of a reading file. */
187 Lisp_Object Vset_auto_coding_function
;
189 /* Functions to be called to process text properties in inserted file. */
190 Lisp_Object Vafter_insert_file_functions
;
192 /* Functions to be called to create text property annotations for file. */
193 Lisp_Object Vwrite_region_annotate_functions
;
195 /* During build_annotations, each time an annotation function is called,
196 this holds the annotations made by the previous functions. */
197 Lisp_Object Vwrite_region_annotations_so_far
;
199 /* File name in which we write a list of all our auto save files. */
200 Lisp_Object Vauto_save_list_file_name
;
202 /* Function to call to read a file name. */
203 Lisp_Object Vread_file_name_function
;
205 /* Current predicate used by read_file_name_internal. */
206 Lisp_Object Vread_file_name_predicate
;
208 /* Nonzero means, when reading a filename in the minibuffer,
209 start out by inserting the default directory into the minibuffer. */
210 int insert_default_directory
;
212 /* On VMS, nonzero means write new files with record format stmlf.
213 Zero means use var format. */
216 /* On NT, specifies the directory separator character, used (eg.) when
217 expanding file names. This can be bound to / or \. */
218 Lisp_Object Vdirectory_sep_char
;
220 extern Lisp_Object Vuser_login_name
;
223 extern Lisp_Object Vw32_get_true_file_attributes
;
226 extern int minibuf_level
;
228 extern int minibuffer_auto_raise
;
230 /* These variables describe handlers that have "already" had a chance
231 to handle the current operation.
233 Vinhibit_file_name_handlers is a list of file name handlers.
234 Vinhibit_file_name_operation is the operation being handled.
235 If we try to handle that operation, we ignore those handlers. */
237 static Lisp_Object Vinhibit_file_name_handlers
;
238 static Lisp_Object Vinhibit_file_name_operation
;
240 Lisp_Object Qfile_error
, Qfile_already_exists
, Qfile_date_error
;
242 Lisp_Object Qfile_name_history
;
244 Lisp_Object Qcar_less_than_car
;
246 static int a_write
P_ ((int, Lisp_Object
, int, int,
247 Lisp_Object
*, struct coding_system
*));
248 static int e_write
P_ ((int, Lisp_Object
, int, int, struct coding_system
*));
252 report_file_error (string
, data
)
256 Lisp_Object errstring
;
259 synchronize_system_messages_locale ();
260 errstring
= code_convert_string_norecord (build_string (strerror (errorno
)),
261 Vlocale_coding_system
, 0);
267 Fsignal (Qfile_already_exists
, Fcons (errstring
, data
));
270 /* System error messages are capitalized. Downcase the initial
271 unless it is followed by a slash. */
272 if (SREF (errstring
, 1) != '/')
273 SSET (errstring
, 0, DOWNCASE (SREF (errstring
, 0)));
275 Fsignal (Qfile_error
,
276 Fcons (build_string (string
), Fcons (errstring
, data
)));
281 close_file_unwind (fd
)
284 emacs_close (XFASTINT (fd
));
288 /* Restore point, having saved it as a marker. */
291 restore_point_unwind (location
)
292 Lisp_Object location
;
294 Fgoto_char (location
);
295 Fset_marker (location
, Qnil
, Qnil
);
299 Lisp_Object Qexpand_file_name
;
300 Lisp_Object Qsubstitute_in_file_name
;
301 Lisp_Object Qdirectory_file_name
;
302 Lisp_Object Qfile_name_directory
;
303 Lisp_Object Qfile_name_nondirectory
;
304 Lisp_Object Qunhandled_file_name_directory
;
305 Lisp_Object Qfile_name_as_directory
;
306 Lisp_Object Qcopy_file
;
307 Lisp_Object Qmake_directory_internal
;
308 Lisp_Object Qmake_directory
;
309 Lisp_Object Qdelete_directory
;
310 Lisp_Object Qdelete_file
;
311 Lisp_Object Qrename_file
;
312 Lisp_Object Qadd_name_to_file
;
313 Lisp_Object Qmake_symbolic_link
;
314 Lisp_Object Qfile_exists_p
;
315 Lisp_Object Qfile_executable_p
;
316 Lisp_Object Qfile_readable_p
;
317 Lisp_Object Qfile_writable_p
;
318 Lisp_Object Qfile_symlink_p
;
319 Lisp_Object Qaccess_file
;
320 Lisp_Object Qfile_directory_p
;
321 Lisp_Object Qfile_regular_p
;
322 Lisp_Object Qfile_accessible_directory_p
;
323 Lisp_Object Qfile_modes
;
324 Lisp_Object Qset_file_modes
;
325 Lisp_Object Qfile_newer_than_file_p
;
326 Lisp_Object Qinsert_file_contents
;
327 Lisp_Object Qwrite_region
;
328 Lisp_Object Qverify_visited_file_modtime
;
329 Lisp_Object Qset_visited_file_modtime
;
331 DEFUN ("find-file-name-handler", Ffind_file_name_handler
, Sfind_file_name_handler
, 2, 2, 0,
332 doc
: /* Return FILENAME's handler function for OPERATION, if it has one.
333 Otherwise, return nil.
334 A file name is handled if one of the regular expressions in
335 `file-name-handler-alist' matches it.
337 If OPERATION equals `inhibit-file-name-operation', then we ignore
338 any handlers that are members of `inhibit-file-name-handlers',
339 but we still do run any other handlers. This lets handlers
340 use the standard functions without calling themselves recursively. */)
341 (filename
, operation
)
342 Lisp_Object filename
, operation
;
344 /* This function must not munge the match data. */
345 Lisp_Object chain
, inhibited_handlers
, result
;
349 CHECK_STRING (filename
);
351 if (EQ (operation
, Vinhibit_file_name_operation
))
352 inhibited_handlers
= Vinhibit_file_name_handlers
;
354 inhibited_handlers
= Qnil
;
356 for (chain
= Vfile_name_handler_alist
; CONSP (chain
);
357 chain
= XCDR (chain
))
367 && (match_pos
= fast_string_match (string
, filename
)) > pos
)
369 Lisp_Object handler
, tem
;
371 handler
= XCDR (elt
);
372 tem
= Fmemq (handler
, inhibited_handlers
);
386 DEFUN ("file-name-directory", Ffile_name_directory
, Sfile_name_directory
,
388 doc
: /* Return the directory component in file name FILENAME.
389 Return nil if FILENAME does not include a directory.
390 Otherwise return a directory spec.
391 Given a Unix syntax file name, returns a string ending in slash;
392 on VMS, perhaps instead a string ending in `:', `]' or `>'. */)
394 Lisp_Object filename
;
397 register const unsigned char *beg
;
399 register unsigned char *beg
;
401 register const unsigned char *p
;
404 CHECK_STRING (filename
);
406 /* If the file name has special constructs in it,
407 call the corresponding file handler. */
408 handler
= Ffind_file_name_handler (filename
, Qfile_name_directory
);
410 return call2 (handler
, Qfile_name_directory
, filename
);
412 #ifdef FILE_SYSTEM_CASE
413 filename
= FILE_SYSTEM_CASE (filename
);
415 beg
= SDATA (filename
);
417 beg
= strcpy (alloca (strlen (beg
) + 1), beg
);
419 p
= beg
+ SBYTES (filename
);
421 while (p
!= beg
&& !IS_DIRECTORY_SEP (p
[-1])
423 && p
[-1] != ':' && p
[-1] != ']' && p
[-1] != '>'
426 /* only recognise drive specifier at the beginning */
428 /* handle the "/:d:foo" and "/:foo" cases correctly */
429 && ((p
== beg
+ 2 && !IS_DIRECTORY_SEP (*beg
))
430 || (p
== beg
+ 4 && IS_DIRECTORY_SEP (*beg
))))
437 /* Expansion of "c:" to drive and default directory. */
440 /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir. */
441 unsigned char *res
= alloca (MAXPATHLEN
+ 1);
442 unsigned char *r
= res
;
444 if (p
== beg
+ 4 && IS_DIRECTORY_SEP (*beg
) && beg
[1] == ':')
446 strncpy (res
, beg
, 2);
451 if (getdefdir (toupper (*beg
) - 'A' + 1, r
))
453 if (!IS_DIRECTORY_SEP (res
[strlen (res
) - 1]))
456 p
= beg
+ strlen (beg
);
459 CORRECT_DIR_SEPS (beg
);
462 if (STRING_MULTIBYTE (filename
))
463 return make_string (beg
, p
- beg
);
464 return make_unibyte_string (beg
, p
- beg
);
467 DEFUN ("file-name-nondirectory", Ffile_name_nondirectory
,
468 Sfile_name_nondirectory
, 1, 1, 0,
469 doc
: /* Return file name FILENAME sans its directory.
470 For example, in a Unix-syntax file name,
471 this is everything after the last slash,
472 or the entire name if it contains no slash. */)
474 Lisp_Object filename
;
476 register const unsigned char *beg
, *p
, *end
;
479 CHECK_STRING (filename
);
481 /* If the file name has special constructs in it,
482 call the corresponding file handler. */
483 handler
= Ffind_file_name_handler (filename
, Qfile_name_nondirectory
);
485 return call2 (handler
, Qfile_name_nondirectory
, filename
);
487 beg
= SDATA (filename
);
488 end
= p
= beg
+ SBYTES (filename
);
490 while (p
!= beg
&& !IS_DIRECTORY_SEP (p
[-1])
492 && p
[-1] != ':' && p
[-1] != ']' && p
[-1] != '>'
495 /* only recognise drive specifier at beginning */
497 /* handle the "/:d:foo" case correctly */
498 && (p
== beg
+ 2 || (p
== beg
+ 4 && IS_DIRECTORY_SEP (*beg
))))
503 if (STRING_MULTIBYTE (filename
))
504 return make_string (p
, end
- p
);
505 return make_unibyte_string (p
, end
- p
);
508 DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory
,
509 Sunhandled_file_name_directory
, 1, 1, 0,
510 doc
: /* Return a directly usable directory name somehow associated with FILENAME.
511 A `directly usable' directory name is one that may be used without the
512 intervention of any file handler.
513 If FILENAME is a directly usable file itself, return
514 \(file-name-directory FILENAME).
515 The `call-process' and `start-process' functions use this function to
516 get a current directory to run processes in. */)
518 Lisp_Object filename
;
522 /* If the file name has special constructs in it,
523 call the corresponding file handler. */
524 handler
= Ffind_file_name_handler (filename
, Qunhandled_file_name_directory
);
526 return call2 (handler
, Qunhandled_file_name_directory
, filename
);
528 return Ffile_name_directory (filename
);
533 file_name_as_directory (out
, in
)
536 int size
= strlen (in
) - 1;
549 /* Is it already a directory string? */
550 if (in
[size
] == ':' || in
[size
] == ']' || in
[size
] == '>')
552 /* Is it a VMS directory file name? If so, hack VMS syntax. */
553 else if (! index (in
, '/')
554 && ((size
> 3 && ! strcmp (&in
[size
- 3], ".DIR"))
555 || (size
> 3 && ! strcmp (&in
[size
- 3], ".dir"))
556 || (size
> 5 && (! strncmp (&in
[size
- 5], ".DIR", 4)
557 || ! strncmp (&in
[size
- 5], ".dir", 4))
558 && (in
[size
- 1] == '.' || in
[size
- 1] == ';')
559 && in
[size
] == '1')))
561 register char *p
, *dot
;
565 dir:x.dir --> dir:[x]
566 dir:[x]y.dir --> dir:[x.y] */
568 while (p
!= in
&& *p
!= ':' && *p
!= '>' && *p
!= ']') p
--;
571 strncpy (out
, in
, p
- in
);
590 dot
= index (p
, '.');
593 /* blindly remove any extension */
594 size
= strlen (out
) + (dot
- p
);
595 strncat (out
, p
, dot
- p
);
606 /* For Unix syntax, Append a slash if necessary */
607 if (!IS_DIRECTORY_SEP (out
[size
]))
609 /* Cannot use DIRECTORY_SEP, which could have any value */
611 out
[size
+ 2] = '\0';
614 CORRECT_DIR_SEPS (out
);
620 DEFUN ("file-name-as-directory", Ffile_name_as_directory
,
621 Sfile_name_as_directory
, 1, 1, 0,
622 doc
: /* Return a string representing the file name FILE interpreted as a directory.
623 This operation exists because a directory is also a file, but its name as
624 a directory is different from its name as a file.
625 The result can be used as the value of `default-directory'
626 or passed as second argument to `expand-file-name'.
627 For a Unix-syntax file name, just appends a slash.
628 On VMS, converts \"[X]FOO.DIR\" to \"[X.FOO]\", etc. */)
639 /* If the file name has special constructs in it,
640 call the corresponding file handler. */
641 handler
= Ffind_file_name_handler (file
, Qfile_name_as_directory
);
643 return call2 (handler
, Qfile_name_as_directory
, file
);
645 buf
= (char *) alloca (SBYTES (file
) + 10);
646 return build_string (file_name_as_directory (buf
, SDATA (file
)));
650 * Convert from directory name to filename.
652 * xyzzy:[mukesh.emacs] => xyzzy:[mukesh]emacs.dir.1
653 * xyzzy:[mukesh] => xyzzy:[000000]mukesh.dir.1
654 * On UNIX, it's simple: just make sure there isn't a terminating /
656 * Value is nonzero if the string output is different from the input.
660 directory_file_name (src
, dst
)
668 struct FAB fab
= cc$rms_fab
;
669 struct NAM nam
= cc$rms_nam
;
670 char esa
[NAM$C_MAXRSS
];
675 if (! index (src
, '/')
676 && (src
[slen
- 1] == ']'
677 || src
[slen
- 1] == ':'
678 || src
[slen
- 1] == '>'))
680 /* VMS style - convert [x.y.z] to [x.y]z, [x] to [000000]x */
682 fab
.fab$b_fns
= slen
;
683 fab
.fab$l_nam
= &nam
;
684 fab
.fab$l_fop
= FAB$M_NAM
;
687 nam
.nam$b_ess
= sizeof esa
;
688 nam
.nam$b_nop
|= NAM$M_SYNCHK
;
690 /* We call SYS$PARSE to handle such things as [--] for us. */
691 if (SYS$
PARSE (&fab
, 0, 0) == RMS$_NORMAL
)
693 slen
= nam
.nam$b_esl
;
694 if (esa
[slen
- 1] == ';' && esa
[slen
- 2] == '.')
699 if (src
[slen
- 1] != ']' && src
[slen
- 1] != '>')
701 /* what about when we have logical_name:???? */
702 if (src
[slen
- 1] == ':')
703 { /* Xlate logical name and see what we get */
704 ptr
= strcpy (dst
, src
); /* upper case for getenv */
707 if ('a' <= *ptr
&& *ptr
<= 'z')
711 dst
[slen
- 1] = 0; /* remove colon */
712 if (!(src
= egetenv (dst
)))
714 /* should we jump to the beginning of this procedure?
715 Good points: allows us to use logical names that xlate
717 Bad points: can be a problem if we just translated to a device
719 For now, I'll punt and always expect VMS names, and hope for
722 if (src
[slen
- 1] != ']' && src
[slen
- 1] != '>')
723 { /* no recursion here! */
729 { /* not a directory spec */
734 bracket
= src
[slen
- 1];
736 /* If bracket is ']' or '>', bracket - 2 is the corresponding
738 ptr
= index (src
, bracket
- 2);
740 { /* no opening bracket */
744 if (!(rptr
= rindex (src
, '.')))
747 strncpy (dst
, src
, slen
);
751 dst
[slen
++] = bracket
;
756 /* If we have the top-level of a rooted directory (i.e. xx:[000000]),
757 then translate the device and recurse. */
758 if (dst
[slen
- 1] == ':'
759 && dst
[slen
- 2] != ':' /* skip decnet nodes */
760 && strcmp (src
+ slen
, "[000000]") == 0)
762 dst
[slen
- 1] = '\0';
763 if ((ptr
= egetenv (dst
))
764 && (rlen
= strlen (ptr
) - 1) > 0
765 && (ptr
[rlen
] == ']' || ptr
[rlen
] == '>')
766 && ptr
[rlen
- 1] == '.')
768 char * buf
= (char *) alloca (strlen (ptr
) + 1);
772 return directory_file_name (buf
, dst
);
777 strcat (dst
, "[000000]");
781 rlen
= strlen (rptr
) - 1;
782 strncat (dst
, rptr
, rlen
);
783 dst
[slen
+ rlen
] = '\0';
784 strcat (dst
, ".DIR.1");
788 /* Process as Unix format: just remove any final slash.
789 But leave "/" unchanged; do not change it to "". */
792 /* Handle // as root for apollo's. */
793 if ((slen
> 2 && dst
[slen
- 1] == '/')
794 || (slen
> 1 && dst
[0] != '/' && dst
[slen
- 1] == '/'))
798 && IS_DIRECTORY_SEP (dst
[slen
- 1])
800 && !IS_ANY_SEP (dst
[slen
- 2])
806 CORRECT_DIR_SEPS (dst
);
811 DEFUN ("directory-file-name", Fdirectory_file_name
, Sdirectory_file_name
,
813 doc
: /* Returns the file name of the directory named DIRECTORY.
814 This is the name of the file that holds the data for the directory DIRECTORY.
815 This operation exists because a directory is also a file, but its name as
816 a directory is different from its name as a file.
817 In Unix-syntax, this function just removes the final slash.
818 On VMS, given a VMS-syntax directory name such as \"[X.Y]\",
819 it returns a file name such as \"[X]Y.DIR.1\". */)
821 Lisp_Object directory
;
826 CHECK_STRING (directory
);
828 if (NILP (directory
))
831 /* If the file name has special constructs in it,
832 call the corresponding file handler. */
833 handler
= Ffind_file_name_handler (directory
, Qdirectory_file_name
);
835 return call2 (handler
, Qdirectory_file_name
, directory
);
838 /* 20 extra chars is insufficient for VMS, since we might perform a
839 logical name translation. an equivalence string can be up to 255
840 chars long, so grab that much extra space... - sss */
841 buf
= (char *) alloca (SBYTES (directory
) + 20 + 255);
843 buf
= (char *) alloca (SBYTES (directory
) + 20);
845 directory_file_name (SDATA (directory
), buf
);
846 return build_string (buf
);
849 static char make_temp_name_tbl
[64] =
851 'A','B','C','D','E','F','G','H',
852 'I','J','K','L','M','N','O','P',
853 'Q','R','S','T','U','V','W','X',
854 'Y','Z','a','b','c','d','e','f',
855 'g','h','i','j','k','l','m','n',
856 'o','p','q','r','s','t','u','v',
857 'w','x','y','z','0','1','2','3',
858 '4','5','6','7','8','9','-','_'
861 static unsigned make_temp_name_count
, make_temp_name_count_initialized_p
;
863 /* Value is a temporary file name starting with PREFIX, a string.
865 The Emacs process number forms part of the result, so there is
866 no danger of generating a name being used by another process.
867 In addition, this function makes an attempt to choose a name
868 which has no existing file. To make this work, PREFIX should be
869 an absolute file name.
871 BASE64_P non-zero means add the pid as 3 characters in base64
872 encoding. In this case, 6 characters will be added to PREFIX to
873 form the file name. Otherwise, if Emacs is running on a system
874 with long file names, add the pid as a decimal number.
876 This function signals an error if no unique file name could be
880 make_temp_name (prefix
, base64_p
)
887 unsigned char *p
, *data
;
891 CHECK_STRING (prefix
);
893 /* VAL is created by adding 6 characters to PREFIX. The first
894 three are the PID of this process, in base 64, and the second
895 three are incremented if the file already exists. This ensures
896 262144 unique file names per PID per PREFIX. */
898 pid
= (int) getpid ();
902 pidbuf
[0] = make_temp_name_tbl
[pid
& 63], pid
>>= 6;
903 pidbuf
[1] = make_temp_name_tbl
[pid
& 63], pid
>>= 6;
904 pidbuf
[2] = make_temp_name_tbl
[pid
& 63], pid
>>= 6;
909 #ifdef HAVE_LONG_FILE_NAMES
910 sprintf (pidbuf
, "%d", pid
);
911 pidlen
= strlen (pidbuf
);
913 pidbuf
[0] = make_temp_name_tbl
[pid
& 63], pid
>>= 6;
914 pidbuf
[1] = make_temp_name_tbl
[pid
& 63], pid
>>= 6;
915 pidbuf
[2] = make_temp_name_tbl
[pid
& 63], pid
>>= 6;
920 len
= SCHARS (prefix
);
921 val
= make_uninit_string (len
+ 3 + pidlen
);
923 bcopy(SDATA (prefix
), data
, len
);
926 bcopy (pidbuf
, p
, pidlen
);
929 /* Here we try to minimize useless stat'ing when this function is
930 invoked many times successively with the same PREFIX. We achieve
931 this by initializing count to a random value, and incrementing it
934 We don't want make-temp-name to be called while dumping,
935 because then make_temp_name_count_initialized_p would get set
936 and then make_temp_name_count would not be set when Emacs starts. */
938 if (!make_temp_name_count_initialized_p
)
940 make_temp_name_count
= (unsigned) time (NULL
);
941 make_temp_name_count_initialized_p
= 1;
947 unsigned num
= make_temp_name_count
;
949 p
[0] = make_temp_name_tbl
[num
& 63], num
>>= 6;
950 p
[1] = make_temp_name_tbl
[num
& 63], num
>>= 6;
951 p
[2] = make_temp_name_tbl
[num
& 63], num
>>= 6;
953 /* Poor man's congruential RN generator. Replace with
954 ++make_temp_name_count for debugging. */
955 make_temp_name_count
+= 25229;
956 make_temp_name_count
%= 225307;
958 if (stat (data
, &ignored
) < 0)
960 /* We want to return only if errno is ENOENT. */
964 /* The error here is dubious, but there is little else we
965 can do. The alternatives are to return nil, which is
966 as bad as (and in many cases worse than) throwing the
967 error, or to ignore the error, which will likely result
968 in looping through 225307 stat's, which is not only
969 dog-slow, but also useless since it will fallback to
970 the errow below, anyway. */
971 report_file_error ("Cannot create temporary name for prefix",
972 Fcons (prefix
, Qnil
));
977 error ("Cannot create temporary name for prefix `%s'",
983 DEFUN ("make-temp-name", Fmake_temp_name
, Smake_temp_name
, 1, 1, 0,
984 doc
: /* Generate temporary file name (string) starting with PREFIX (a string).
985 The Emacs process number forms part of the result,
986 so there is no danger of generating a name being used by another process.
988 In addition, this function makes an attempt to choose a name
989 which has no existing file. To make this work,
990 PREFIX should be an absolute file name.
992 There is a race condition between calling `make-temp-name' and creating the
993 file which opens all kinds of security holes. For that reason, you should
994 probably use `make-temp-file' instead, except in three circumstances:
996 * If you are creating the file in the user's home directory.
997 * If you are creating a directory rather than an ordinary file.
998 * If you are taking special precautions as `make-temp-file' does. */)
1002 return make_temp_name (prefix
, 0);
1007 DEFUN ("expand-file-name", Fexpand_file_name
, Sexpand_file_name
, 1, 2, 0,
1008 doc
: /* Convert filename NAME to absolute, and canonicalize it.
1009 Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative
1010 (does not start with slash); if DEFAULT-DIRECTORY is nil or missing,
1011 the current buffer's value of default-directory is used.
1012 File name components that are `.' are removed, and
1013 so are file name components followed by `..', along with the `..' itself;
1014 note that these simplifications are done without checking the resulting
1015 file names in the file system.
1016 An initial `~/' expands to your home directory.
1017 An initial `~USER/' expands to USER's home directory.
1018 See also the function `substitute-in-file-name'. */)
1019 (name
, default_directory
)
1020 Lisp_Object name
, default_directory
;
1024 register unsigned char *newdir
, *p
, *o
;
1026 unsigned char *target
;
1029 unsigned char * colon
= 0;
1030 unsigned char * close
= 0;
1031 unsigned char * slash
= 0;
1032 unsigned char * brack
= 0;
1033 int lbrack
= 0, rbrack
= 0;
1038 int collapse_newdir
= 1;
1042 Lisp_Object handler
;
1044 CHECK_STRING (name
);
1046 /* If the file name has special constructs in it,
1047 call the corresponding file handler. */
1048 handler
= Ffind_file_name_handler (name
, Qexpand_file_name
);
1049 if (!NILP (handler
))
1050 return call3 (handler
, Qexpand_file_name
, name
, default_directory
);
1052 /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted. */
1053 if (NILP (default_directory
))
1054 default_directory
= current_buffer
->directory
;
1055 if (! STRINGP (default_directory
))
1058 /* "/" is not considered a root directory on DOS_NT, so using "/"
1059 here causes an infinite recursion in, e.g., the following:
1061 (let (default-directory)
1062 (expand-file-name "a"))
1064 To avoid this, we set default_directory to the root of the
1066 extern char *emacs_root_dir (void);
1068 default_directory
= build_string (emacs_root_dir ());
1070 default_directory
= build_string ("/");
1074 if (!NILP (default_directory
))
1076 handler
= Ffind_file_name_handler (default_directory
, Qexpand_file_name
);
1077 if (!NILP (handler
))
1078 return call3 (handler
, Qexpand_file_name
, name
, default_directory
);
1081 o
= SDATA (default_directory
);
1083 /* Make sure DEFAULT_DIRECTORY is properly expanded.
1084 It would be better to do this down below where we actually use
1085 default_directory. Unfortunately, calling Fexpand_file_name recursively
1086 could invoke GC, and the strings might be relocated. This would
1087 be annoying because we have pointers into strings lying around
1088 that would need adjusting, and people would add new pointers to
1089 the code and forget to adjust them, resulting in intermittent bugs.
1090 Putting this call here avoids all that crud.
1092 The EQ test avoids infinite recursion. */
1093 if (! NILP (default_directory
) && !EQ (default_directory
, name
)
1094 /* Save time in some common cases - as long as default_directory
1095 is not relative, it can be canonicalized with name below (if it
1096 is needed at all) without requiring it to be expanded now. */
1098 /* Detect MSDOS file names with drive specifiers. */
1099 && ! (IS_DRIVE (o
[0]) && IS_DEVICE_SEP (o
[1]) && IS_DIRECTORY_SEP (o
[2]))
1101 /* Detect Windows file names in UNC format. */
1102 && ! (IS_DIRECTORY_SEP (o
[0]) && IS_DIRECTORY_SEP (o
[1]))
1104 #else /* not DOS_NT */
1105 /* Detect Unix absolute file names (/... alone is not absolute on
1107 && ! (IS_DIRECTORY_SEP (o
[0]))
1108 #endif /* not DOS_NT */
1111 struct gcpro gcpro1
;
1114 default_directory
= Fexpand_file_name (default_directory
, Qnil
);
1119 /* Filenames on VMS are always upper case. */
1120 name
= Fupcase (name
);
1122 #ifdef FILE_SYSTEM_CASE
1123 name
= FILE_SYSTEM_CASE (name
);
1129 /* We will force directory separators to be either all \ or /, so make
1130 a local copy to modify, even if there ends up being no change. */
1131 nm
= strcpy (alloca (strlen (nm
) + 1), nm
);
1133 /* Note if special escape prefix is present, but remove for now. */
1134 if (nm
[0] == '/' && nm
[1] == ':')
1140 /* Find and remove drive specifier if present; this makes nm absolute
1141 even if the rest of the name appears to be relative. Only look for
1142 drive specifier at the beginning. */
1143 if (IS_DRIVE (nm
[0]) && IS_DEVICE_SEP (nm
[1]))
1150 /* If we see "c://somedir", we want to strip the first slash after the
1151 colon when stripping the drive letter. Otherwise, this expands to
1153 if (drive
&& IS_DIRECTORY_SEP (nm
[0]) && IS_DIRECTORY_SEP (nm
[1]))
1155 #endif /* WINDOWSNT */
1159 /* Discard any previous drive specifier if nm is now in UNC format. */
1160 if (IS_DIRECTORY_SEP (nm
[0]) && IS_DIRECTORY_SEP (nm
[1]))
1166 /* If nm is absolute, look for `/./' or `/../' or `//''sequences; if
1167 none are found, we can probably return right away. We will avoid
1168 allocating a new string if name is already fully expanded. */
1170 IS_DIRECTORY_SEP (nm
[0])
1172 && drive
&& !is_escaped
1175 && (drive
|| IS_DIRECTORY_SEP (nm
[1])) && !is_escaped
1182 /* If it turns out that the filename we want to return is just a
1183 suffix of FILENAME, we don't need to go through and edit
1184 things; we just need to construct a new string using data
1185 starting at the middle of FILENAME. If we set lose to a
1186 non-zero value, that means we've discovered that we can't do
1193 /* Since we know the name is absolute, we can assume that each
1194 element starts with a "/". */
1196 /* "." and ".." are hairy. */
1197 if (IS_DIRECTORY_SEP (p
[0])
1199 && (IS_DIRECTORY_SEP (p
[2])
1201 || (p
[2] == '.' && (IS_DIRECTORY_SEP (p
[3])
1204 /* We want to replace multiple `/' in a row with a single
1207 && IS_DIRECTORY_SEP (p
[0])
1208 && IS_DIRECTORY_SEP (p
[1]))
1215 /* if dev:[dir]/, move nm to / */
1216 if (!slash
&& p
> nm
&& (brack
|| colon
)) {
1217 nm
= (brack
? brack
+ 1 : colon
+ 1);
1218 lbrack
= rbrack
= 0;
1226 /* VMS pre V4.4,convert '-'s in filenames. */
1227 if (lbrack
== rbrack
)
1229 if (dots
< 2) /* this is to allow negative version numbers */
1234 if (lbrack
> rbrack
&&
1235 ((p
[-1] == '.' || p
[-1] == '[' || p
[-1] == '<') &&
1236 (p
[1] == '.' || p
[1] == ']' || p
[1] == '>')))
1242 /* count open brackets, reset close bracket pointer */
1243 if (p
[0] == '[' || p
[0] == '<')
1244 lbrack
++, brack
= 0;
1245 /* count close brackets, set close bracket pointer */
1246 if (p
[0] == ']' || p
[0] == '>')
1247 rbrack
++, brack
= p
;
1248 /* detect ][ or >< */
1249 if ((p
[0] == ']' || p
[0] == '>') && (p
[1] == '[' || p
[1] == '<'))
1251 if ((p
[0] == ':' || p
[0] == ']' || p
[0] == '>') && p
[1] == '~')
1252 nm
= p
+ 1, lose
= 1;
1253 if (p
[0] == ':' && (colon
|| slash
))
1254 /* if dev1:[dir]dev2:, move nm to dev2: */
1260 /* if /name/dev:, move nm to dev: */
1263 /* if node::dev:, move colon following dev */
1264 else if (colon
&& colon
[-1] == ':')
1266 /* if dev1:dev2:, move nm to dev2: */
1267 else if (colon
&& colon
[-1] != ':')
1272 if (p
[0] == ':' && !colon
)
1278 if (lbrack
== rbrack
)
1281 else if (p
[0] == '.')
1289 if (index (nm
, '/'))
1290 return build_string (sys_translate_unix (nm
));
1293 /* Make sure directories are all separated with / or \ as
1294 desired, but avoid allocation of a new string when not
1296 CORRECT_DIR_SEPS (nm
);
1298 if (IS_DIRECTORY_SEP (nm
[1]))
1300 if (strcmp (nm
, SDATA (name
)) != 0)
1301 name
= build_string (nm
);
1305 /* drive must be set, so this is okay */
1306 if (strcmp (nm
- 2, SDATA (name
)) != 0)
1308 name
= make_string (nm
- 2, p
- nm
+ 2);
1309 SSET (name
, 0, DRIVE_LETTER (drive
));
1310 SSET (name
, 1, ':');
1313 #else /* not DOS_NT */
1314 if (nm
== SDATA (name
))
1316 return build_string (nm
);
1317 #endif /* not DOS_NT */
1321 /* At this point, nm might or might not be an absolute file name. We
1322 need to expand ~ or ~user if present, otherwise prefix nm with
1323 default_directory if nm is not absolute, and finally collapse /./
1324 and /foo/../ sequences.
1326 We set newdir to be the appropriate prefix if one is needed:
1327 - the relevant user directory if nm starts with ~ or ~user
1328 - the specified drive's working dir (DOS/NT only) if nm does not
1330 - the value of default_directory.
1332 Note that these prefixes are not guaranteed to be absolute (except
1333 for the working dir of a drive). Therefore, to ensure we always
1334 return an absolute name, if the final prefix is not absolute we
1335 append it to the current working directory. */
1339 if (nm
[0] == '~') /* prefix ~ */
1341 if (IS_DIRECTORY_SEP (nm
[1])
1345 || nm
[1] == 0) /* ~ by itself */
1347 if (!(newdir
= (unsigned char *) egetenv ("HOME")))
1348 newdir
= (unsigned char *) "";
1351 collapse_newdir
= 0;
1354 nm
++; /* Don't leave the slash in nm. */
1357 else /* ~user/filename */
1359 for (p
= nm
; *p
&& (!IS_DIRECTORY_SEP (*p
)
1364 o
= (unsigned char *) alloca (p
- nm
+ 1);
1365 bcopy ((char *) nm
, o
, p
- nm
);
1368 pw
= (struct passwd
*) getpwnam (o
+ 1);
1371 newdir
= (unsigned char *) pw
-> pw_dir
;
1373 nm
= p
+ 1; /* skip the terminator */
1377 collapse_newdir
= 0;
1382 /* If we don't find a user of that name, leave the name
1383 unchanged; don't move nm forward to p. */
1388 /* On DOS and Windows, nm is absolute if a drive name was specified;
1389 use the drive's current directory as the prefix if needed. */
1390 if (!newdir
&& drive
)
1392 /* Get default directory if needed to make nm absolute. */
1393 if (!IS_DIRECTORY_SEP (nm
[0]))
1395 newdir
= alloca (MAXPATHLEN
+ 1);
1396 if (!getdefdir (toupper (drive
) - 'A' + 1, newdir
))
1401 /* Either nm starts with /, or drive isn't mounted. */
1402 newdir
= alloca (4);
1403 newdir
[0] = DRIVE_LETTER (drive
);
1411 /* Finally, if no prefix has been specified and nm is not absolute,
1412 then it must be expanded relative to default_directory. */
1416 /* /... alone is not absolute on DOS and Windows. */
1417 && !IS_DIRECTORY_SEP (nm
[0])
1420 && !(IS_DIRECTORY_SEP (nm
[0]) && IS_DIRECTORY_SEP (nm
[1]))
1427 newdir
= SDATA (default_directory
);
1429 /* Note if special escape prefix is present, but remove for now. */
1430 if (newdir
[0] == '/' && newdir
[1] == ':')
1441 /* First ensure newdir is an absolute name. */
1443 /* Detect MSDOS file names with drive specifiers. */
1444 ! (IS_DRIVE (newdir
[0])
1445 && IS_DEVICE_SEP (newdir
[1]) && IS_DIRECTORY_SEP (newdir
[2]))
1447 /* Detect Windows file names in UNC format. */
1448 && ! (IS_DIRECTORY_SEP (newdir
[0]) && IS_DIRECTORY_SEP (newdir
[1]))
1452 /* Effectively, let newdir be (expand-file-name newdir cwd).
1453 Because of the admonition against calling expand-file-name
1454 when we have pointers into lisp strings, we accomplish this
1455 indirectly by prepending newdir to nm if necessary, and using
1456 cwd (or the wd of newdir's drive) as the new newdir. */
1458 if (IS_DRIVE (newdir
[0]) && newdir
[1] == ':')
1463 if (!IS_DIRECTORY_SEP (nm
[0]))
1465 char * tmp
= alloca (strlen (newdir
) + strlen (nm
) + 2);
1466 file_name_as_directory (tmp
, newdir
);
1470 newdir
= alloca (MAXPATHLEN
+ 1);
1473 if (!getdefdir (toupper (drive
) - 'A' + 1, newdir
))
1480 /* Strip off drive name from prefix, if present. */
1481 if (IS_DRIVE (newdir
[0]) && newdir
[1] == ':')
1487 /* Keep only a prefix from newdir if nm starts with slash
1488 (//server/share for UNC, nothing otherwise). */
1489 if (IS_DIRECTORY_SEP (nm
[0]) && collapse_newdir
)
1492 if (IS_DIRECTORY_SEP (newdir
[0]) && IS_DIRECTORY_SEP (newdir
[1]))
1494 newdir
= strcpy (alloca (strlen (newdir
) + 1), newdir
);
1496 while (*p
&& !IS_DIRECTORY_SEP (*p
)) p
++;
1498 while (*p
&& !IS_DIRECTORY_SEP (*p
)) p
++;
1510 /* Get rid of any slash at the end of newdir, unless newdir is
1511 just / or // (an incomplete UNC name). */
1512 length
= strlen (newdir
);
1513 if (length
> 1 && IS_DIRECTORY_SEP (newdir
[length
- 1])
1515 && !(length
== 2 && IS_DIRECTORY_SEP (newdir
[0]))
1519 unsigned char *temp
= (unsigned char *) alloca (length
);
1520 bcopy (newdir
, temp
, length
- 1);
1521 temp
[length
- 1] = 0;
1529 /* Now concatenate the directory and name to new space in the stack frame */
1530 tlen
+= strlen (nm
) + 1;
1532 /* Reserve space for drive specifier and escape prefix, since either
1533 or both may need to be inserted. (The Microsoft x86 compiler
1534 produces incorrect code if the following two lines are combined.) */
1535 target
= (unsigned char *) alloca (tlen
+ 4);
1537 #else /* not DOS_NT */
1538 target
= (unsigned char *) alloca (tlen
);
1539 #endif /* not DOS_NT */
1545 if (nm
[0] == 0 || IS_DIRECTORY_SEP (nm
[0]))
1548 /* If newdir is effectively "C:/", then the drive letter will have
1549 been stripped and newdir will be "/". Concatenating with an
1550 absolute directory in nm produces "//", which will then be
1551 incorrectly treated as a network share. Ignore newdir in
1552 this case (keeping the drive letter). */
1553 if (!(drive
&& nm
[0] && IS_DIRECTORY_SEP (newdir
[0])
1554 && newdir
[1] == '\0'))
1556 strcpy (target
, newdir
);
1560 file_name_as_directory (target
, newdir
);
1563 strcat (target
, nm
);
1565 if (index (target
, '/'))
1566 strcpy (target
, sys_translate_unix (target
));
1569 /* ASSERT (IS_DIRECTORY_SEP (target[0])) if not VMS */
1571 /* Now canonicalize by removing `//', `/.' and `/foo/..' if they
1580 if (*p
!= ']' && *p
!= '>' && *p
!= '-')
1586 else if ((p
[0] == ']' || p
[0] == '>') && p
[0] == p
[1] + 2)
1587 /* brackets are offset from each other by 2 */
1590 if (*p
!= '.' && *p
!= '-' && o
[-1] != '.')
1591 /* convert [foo][bar] to [bar] */
1592 while (o
[-1] != '[' && o
[-1] != '<')
1594 else if (*p
== '-' && *o
!= '.')
1597 else if (p
[0] == '-' && o
[-1] == '.' &&
1598 (p
[1] == '.' || p
[1] == ']' || p
[1] == '>'))
1599 /* flush .foo.- ; leave - if stopped by '[' or '<' */
1603 while (o
[-1] != '.' && o
[-1] != '[' && o
[-1] != '<');
1604 if (p
[1] == '.') /* foo.-.bar ==> bar. */
1606 else if (o
[-1] == '.') /* '.foo.-]' ==> ']' */
1608 /* else [foo.-] ==> [-] */
1614 o
[-1] != '[' && o
[-1] != '<' && o
[-1] != '.' &&
1615 p
[1] != ']' && p
[1] != '>' && p
[1] != '.')
1621 if (!IS_DIRECTORY_SEP (*p
))
1625 else if (IS_DIRECTORY_SEP (p
[0])
1627 && (IS_DIRECTORY_SEP (p
[2])
1630 /* If "/." is the entire filename, keep the "/". Otherwise,
1631 just delete the whole "/.". */
1632 if (o
== target
&& p
[2] == '\0')
1636 else if (IS_DIRECTORY_SEP (p
[0]) && p
[1] == '.' && p
[2] == '.'
1637 /* `/../' is the "superroot" on certain file systems. */
1639 && (IS_DIRECTORY_SEP (p
[3]) || p
[3] == 0))
1641 while (o
!= target
&& (--o
) && !IS_DIRECTORY_SEP (*o
))
1643 /* Keep initial / only if this is the whole name. */
1644 if (o
== target
&& IS_ANY_SEP (*o
) && p
[3] == 0)
1649 && IS_DIRECTORY_SEP (p
[0]) && IS_DIRECTORY_SEP (p
[1]))
1651 /* Collapse multiple `/' in a row. */
1653 while (IS_DIRECTORY_SEP (*p
))
1660 #endif /* not VMS */
1664 /* At last, set drive name. */
1666 /* Except for network file name. */
1667 if (!(IS_DIRECTORY_SEP (target
[0]) && IS_DIRECTORY_SEP (target
[1])))
1668 #endif /* WINDOWSNT */
1670 if (!drive
) abort ();
1672 target
[0] = DRIVE_LETTER (drive
);
1675 /* Reinsert the escape prefix if required. */
1682 CORRECT_DIR_SEPS (target
);
1685 return make_string (target
, o
- target
);
1689 /* PLEASE DO NOT DELETE THIS COMMENTED-OUT VERSION!
1690 This is the old version of expand-file-name, before it was thoroughly
1691 rewritten for Emacs 10.31. We leave this version here commented-out,
1692 because the code is very complex and likely to have subtle bugs. If
1693 bugs _are_ found, it might be of interest to look at the old code and
1694 see what did it do in the relevant situation.
1696 Don't remove this code: it's true that it will be accessible via CVS,
1697 but a few years from deletion, people will forget it is there. */
1699 /* Changed this DEFUN to a DEAFUN, so as not to confuse `make-docfile'. */
1700 DEAFUN ("expand-file-name", Fexpand_file_name
, Sexpand_file_name
, 1, 2, 0,
1701 "Convert FILENAME to absolute, and canonicalize it.\n\
1702 Second arg DEFAULT is directory to start with if FILENAME is relative\n\
1703 (does not start with slash); if DEFAULT is nil or missing,\n\
1704 the current buffer's value of default-directory is used.\n\
1705 Filenames containing `.' or `..' as components are simplified;\n\
1706 initial `~/' expands to your home directory.\n\
1707 See also the function `substitute-in-file-name'.")
1709 Lisp_Object name
, defalt
;
1713 register unsigned char *newdir
, *p
, *o
;
1715 unsigned char *target
;
1719 unsigned char * colon
= 0;
1720 unsigned char * close
= 0;
1721 unsigned char * slash
= 0;
1722 unsigned char * brack
= 0;
1723 int lbrack
= 0, rbrack
= 0;
1727 CHECK_STRING (name
);
1730 /* Filenames on VMS are always upper case. */
1731 name
= Fupcase (name
);
1736 /* If nm is absolute, flush ...// and detect /./ and /../.
1737 If no /./ or /../ we can return right away. */
1749 if (p
[0] == '/' && p
[1] == '/'
1751 /* // at start of filename is meaningful on Apollo system. */
1756 if (p
[0] == '/' && p
[1] == '~')
1757 nm
= p
+ 1, lose
= 1;
1758 if (p
[0] == '/' && p
[1] == '.'
1759 && (p
[2] == '/' || p
[2] == 0
1760 || (p
[2] == '.' && (p
[3] == '/' || p
[3] == 0))))
1766 /* if dev:[dir]/, move nm to / */
1767 if (!slash
&& p
> nm
&& (brack
|| colon
)) {
1768 nm
= (brack
? brack
+ 1 : colon
+ 1);
1769 lbrack
= rbrack
= 0;
1777 /* VMS pre V4.4,convert '-'s in filenames. */
1778 if (lbrack
== rbrack
)
1780 if (dots
< 2) /* this is to allow negative version numbers */
1785 if (lbrack
> rbrack
&&
1786 ((p
[-1] == '.' || p
[-1] == '[' || p
[-1] == '<') &&
1787 (p
[1] == '.' || p
[1] == ']' || p
[1] == '>')))
1793 /* count open brackets, reset close bracket pointer */
1794 if (p
[0] == '[' || p
[0] == '<')
1795 lbrack
++, brack
= 0;
1796 /* count close brackets, set close bracket pointer */
1797 if (p
[0] == ']' || p
[0] == '>')
1798 rbrack
++, brack
= p
;
1799 /* detect ][ or >< */
1800 if ((p
[0] == ']' || p
[0] == '>') && (p
[1] == '[' || p
[1] == '<'))
1802 if ((p
[0] == ':' || p
[0] == ']' || p
[0] == '>') && p
[1] == '~')
1803 nm
= p
+ 1, lose
= 1;
1804 if (p
[0] == ':' && (colon
|| slash
))
1805 /* if dev1:[dir]dev2:, move nm to dev2: */
1811 /* If /name/dev:, move nm to dev: */
1814 /* If node::dev:, move colon following dev */
1815 else if (colon
&& colon
[-1] == ':')
1817 /* If dev1:dev2:, move nm to dev2: */
1818 else if (colon
&& colon
[-1] != ':')
1823 if (p
[0] == ':' && !colon
)
1829 if (lbrack
== rbrack
)
1832 else if (p
[0] == '.')
1840 if (index (nm
, '/'))
1841 return build_string (sys_translate_unix (nm
));
1843 if (nm
== SDATA (name
))
1845 return build_string (nm
);
1849 /* Now determine directory to start with and put it in NEWDIR */
1853 if (nm
[0] == '~') /* prefix ~ */
1858 || nm
[1] == 0)/* ~/filename */
1860 if (!(newdir
= (unsigned char *) egetenv ("HOME")))
1861 newdir
= (unsigned char *) "";
1864 nm
++; /* Don't leave the slash in nm. */
1867 else /* ~user/filename */
1869 /* Get past ~ to user */
1870 unsigned char *user
= nm
+ 1;
1871 /* Find end of name. */
1872 unsigned char *ptr
= (unsigned char *) index (user
, '/');
1873 int len
= ptr
? ptr
- user
: strlen (user
);
1875 unsigned char *ptr1
= index (user
, ':');
1876 if (ptr1
!= 0 && ptr1
- user
< len
)
1879 /* Copy the user name into temp storage. */
1880 o
= (unsigned char *) alloca (len
+ 1);
1881 bcopy ((char *) user
, o
, len
);
1884 /* Look up the user name. */
1885 pw
= (struct passwd
*) getpwnam (o
+ 1);
1887 error ("\"%s\" isn't a registered user", o
+ 1);
1889 newdir
= (unsigned char *) pw
->pw_dir
;
1891 /* Discard the user name from NM. */
1898 #endif /* not VMS */
1902 defalt
= current_buffer
->directory
;
1903 CHECK_STRING (defalt
);
1904 newdir
= SDATA (defalt
);
1907 /* Now concatenate the directory and name to new space in the stack frame */
1909 tlen
= (newdir
? strlen (newdir
) + 1 : 0) + strlen (nm
) + 1;
1910 target
= (unsigned char *) alloca (tlen
);
1916 if (nm
[0] == 0 || nm
[0] == '/')
1917 strcpy (target
, newdir
);
1920 file_name_as_directory (target
, newdir
);
1923 strcat (target
, nm
);
1925 if (index (target
, '/'))
1926 strcpy (target
, sys_translate_unix (target
));
1929 /* Now canonicalize by removing /. and /foo/.. if they appear */
1937 if (*p
!= ']' && *p
!= '>' && *p
!= '-')
1943 else if ((p
[0] == ']' || p
[0] == '>') && p
[0] == p
[1] + 2)
1944 /* brackets are offset from each other by 2 */
1947 if (*p
!= '.' && *p
!= '-' && o
[-1] != '.')
1948 /* convert [foo][bar] to [bar] */
1949 while (o
[-1] != '[' && o
[-1] != '<')
1951 else if (*p
== '-' && *o
!= '.')
1954 else if (p
[0] == '-' && o
[-1] == '.' &&
1955 (p
[1] == '.' || p
[1] == ']' || p
[1] == '>'))
1956 /* flush .foo.- ; leave - if stopped by '[' or '<' */
1960 while (o
[-1] != '.' && o
[-1] != '[' && o
[-1] != '<');
1961 if (p
[1] == '.') /* foo.-.bar ==> bar. */
1963 else if (o
[-1] == '.') /* '.foo.-]' ==> ']' */
1965 /* else [foo.-] ==> [-] */
1971 o
[-1] != '[' && o
[-1] != '<' && o
[-1] != '.' &&
1972 p
[1] != ']' && p
[1] != '>' && p
[1] != '.')
1982 else if (!strncmp (p
, "//", 2)
1984 /* // at start of filename is meaningful in Apollo system. */
1992 else if (p
[0] == '/' && p
[1] == '.' &&
1993 (p
[2] == '/' || p
[2] == 0))
1995 else if (!strncmp (p
, "/..", 3)
1996 /* `/../' is the "superroot" on certain file systems. */
1998 && (p
[3] == '/' || p
[3] == 0))
2000 while (o
!= target
&& *--o
!= '/')
2003 if (o
== target
+ 1 && o
[-1] == '/' && o
[0] == '/')
2007 if (o
== target
&& *o
== '/')
2015 #endif /* not VMS */
2018 return make_string (target
, o
- target
);
2022 DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name
,
2023 Ssubstitute_in_file_name
, 1, 1, 0,
2024 doc
: /* Substitute environment variables referred to in FILENAME.
2025 `$FOO' where FOO is an environment variable name means to substitute
2026 the value of that variable. The variable name should be terminated
2027 with a character not a letter, digit or underscore; otherwise, enclose
2028 the entire variable name in braces.
2029 If `/~' appears, all of FILENAME through that `/' is discarded.
2031 On VMS, `$' substitution is not done; this function does little and only
2032 duplicates what `expand-file-name' does. */)
2034 Lisp_Object filename
;
2038 register unsigned char *s
, *p
, *o
, *x
, *endp
;
2039 unsigned char *target
= NULL
;
2041 int substituted
= 0;
2044 Lisp_Object handler
;
2046 CHECK_STRING (filename
);
2048 /* If the file name has special constructs in it,
2049 call the corresponding file handler. */
2050 handler
= Ffind_file_name_handler (filename
, Qsubstitute_in_file_name
);
2051 if (!NILP (handler
))
2052 return call2 (handler
, Qsubstitute_in_file_name
, filename
);
2054 nm
= SDATA (filename
);
2056 nm
= strcpy (alloca (strlen (nm
) + 1), nm
);
2057 CORRECT_DIR_SEPS (nm
);
2058 substituted
= (strcmp (nm
, SDATA (filename
)) != 0);
2060 endp
= nm
+ SBYTES (filename
);
2062 /* If /~ or // appears, discard everything through first slash. */
2064 for (p
= nm
; p
!= endp
; p
++)
2067 #if defined (APOLLO) || defined (WINDOWSNT)
2068 /* // at start of file name is meaningful in Apollo and
2069 WindowsNT systems. */
2070 || (IS_DIRECTORY_SEP (p
[0]) && p
- 1 != nm
)
2071 #else /* not (APOLLO || WINDOWSNT) */
2072 || IS_DIRECTORY_SEP (p
[0])
2073 #endif /* not (APOLLO || WINDOWSNT) */
2078 || p
[-1] == ':' || p
[-1] == ']' || p
[-1] == '>'
2080 || IS_DIRECTORY_SEP (p
[-1])))
2082 for (s
= p
; *s
&& (!IS_DIRECTORY_SEP (*s
)
2087 if (p
[0] == '~' && s
> p
+ 1) /* we've got "/~something/" */
2089 o
= (unsigned char *) alloca (s
- p
+ 1);
2090 bcopy ((char *) p
, o
, s
- p
);
2093 pw
= (struct passwd
*) getpwnam (o
+ 1);
2095 /* If we have ~/ or ~user and `user' exists, discard
2096 everything up to ~. But if `user' does not exist, leave
2097 ~user alone, it might be a literal file name. */
2098 if (IS_DIRECTORY_SEP (p
[0]) || s
== p
+ 1 || pw
)
2105 /* see comment in expand-file-name about drive specifiers */
2106 else if (IS_DRIVE (p
[0]) && p
[1] == ':'
2107 && p
> nm
&& IS_DIRECTORY_SEP (p
[-1]))
2116 return build_string (nm
);
2119 /* See if any variables are substituted into the string
2120 and find the total length of their values in `total' */
2122 for (p
= nm
; p
!= endp
;)
2132 /* "$$" means a single "$" */
2141 while (p
!= endp
&& *p
!= '}') p
++;
2142 if (*p
!= '}') goto missingclose
;
2148 while (p
!= endp
&& (isalnum (*p
) || *p
== '_')) p
++;
2152 /* Copy out the variable name */
2153 target
= (unsigned char *) alloca (s
- o
+ 1);
2154 strncpy (target
, o
, s
- o
);
2157 strupr (target
); /* $home == $HOME etc. */
2160 /* Get variable value */
2161 o
= (unsigned char *) egetenv (target
);
2164 total
+= strlen (o
);
2174 /* If substitution required, recopy the string and do it */
2175 /* Make space in stack frame for the new copy */
2176 xnm
= (unsigned char *) alloca (SBYTES (filename
) + total
+ 1);
2179 /* Copy the rest of the name through, replacing $ constructs with values */
2196 while (p
!= endp
&& *p
!= '}') p
++;
2197 if (*p
!= '}') goto missingclose
;
2203 while (p
!= endp
&& (isalnum (*p
) || *p
== '_')) p
++;
2207 /* Copy out the variable name */
2208 target
= (unsigned char *) alloca (s
- o
+ 1);
2209 strncpy (target
, o
, s
- o
);
2212 strupr (target
); /* $home == $HOME etc. */
2215 /* Get variable value */
2216 o
= (unsigned char *) egetenv (target
);
2220 strcpy (x
, target
); x
+= strlen (target
);
2222 else if (STRING_MULTIBYTE (filename
))
2224 /* If the original string is multibyte,
2225 convert what we substitute into multibyte. */
2228 int c
= unibyte_char_to_multibyte (*o
++);
2229 x
+= CHAR_STRING (c
, x
);
2241 /* If /~ or // appears, discard everything through first slash. */
2243 for (p
= xnm
; p
!= x
; p
++)
2245 #if defined (APOLLO) || defined (WINDOWSNT)
2246 || (IS_DIRECTORY_SEP (p
[0]) && p
- 1 != xnm
)
2247 #else /* not (APOLLO || WINDOWSNT) */
2248 || IS_DIRECTORY_SEP (p
[0])
2249 #endif /* not (APOLLO || WINDOWSNT) */
2251 && p
!= xnm
&& IS_DIRECTORY_SEP (p
[-1]))
2254 else if (IS_DRIVE (p
[0]) && p
[1] == ':'
2255 && p
> xnm
&& IS_DIRECTORY_SEP (p
[-1]))
2259 if (STRING_MULTIBYTE (filename
))
2260 return make_string (xnm
, x
- xnm
);
2261 return make_unibyte_string (xnm
, x
- xnm
);
2264 error ("Bad format environment-variable substitution");
2266 error ("Missing \"}\" in environment-variable substitution");
2268 error ("Substituting nonexistent environment variable \"%s\"", target
);
2271 #endif /* not VMS */
2275 /* A slightly faster and more convenient way to get
2276 (directory-file-name (expand-file-name FOO)). */
2279 expand_and_dir_to_file (filename
, defdir
)
2280 Lisp_Object filename
, defdir
;
2282 register Lisp_Object absname
;
2284 absname
= Fexpand_file_name (filename
, defdir
);
2287 register int c
= SREF (absname
, SBYTES (absname
) - 1);
2288 if (c
== ':' || c
== ']' || c
== '>')
2289 absname
= Fdirectory_file_name (absname
);
2292 /* Remove final slash, if any (unless this is the root dir).
2293 stat behaves differently depending! */
2294 if (SCHARS (absname
) > 1
2295 && IS_DIRECTORY_SEP (SREF (absname
, SBYTES (absname
) - 1))
2296 && !IS_DEVICE_SEP (SREF (absname
, SBYTES (absname
)-2)))
2297 /* We cannot take shortcuts; they might be wrong for magic file names. */
2298 absname
= Fdirectory_file_name (absname
);
2303 /* Signal an error if the file ABSNAME already exists.
2304 If INTERACTIVE is nonzero, ask the user whether to proceed,
2305 and bypass the error if the user says to go ahead.
2306 QUERYSTRING is a name for the action that is being considered
2309 *STATPTR is used to store the stat information if the file exists.
2310 If the file does not exist, STATPTR->st_mode is set to 0.
2311 If STATPTR is null, we don't store into it.
2313 If QUICK is nonzero, we ask for y or n, not yes or no. */
2316 barf_or_query_if_file_exists (absname
, querystring
, interactive
, statptr
, quick
)
2317 Lisp_Object absname
;
2318 unsigned char *querystring
;
2320 struct stat
*statptr
;
2323 register Lisp_Object tem
, encoded_filename
;
2324 struct stat statbuf
;
2325 struct gcpro gcpro1
;
2327 encoded_filename
= ENCODE_FILE (absname
);
2329 /* stat is a good way to tell whether the file exists,
2330 regardless of what access permissions it has. */
2331 if (stat (SDATA (encoded_filename
), &statbuf
) >= 0)
2334 Fsignal (Qfile_already_exists
,
2335 Fcons (build_string ("File already exists"),
2336 Fcons (absname
, Qnil
)));
2338 tem
= format1 ("File %s already exists; %s anyway? ",
2339 SDATA (absname
), querystring
);
2341 tem
= Fy_or_n_p (tem
);
2343 tem
= do_yes_or_no_p (tem
);
2346 Fsignal (Qfile_already_exists
,
2347 Fcons (build_string ("File already exists"),
2348 Fcons (absname
, Qnil
)));
2355 statptr
->st_mode
= 0;
2360 DEFUN ("copy-file", Fcopy_file
, Scopy_file
, 2, 4,
2361 "fCopy file: \nFCopy %s to file: \np\nP",
2362 doc
: /* Copy FILE to NEWNAME. Both args must be strings.
2363 If NEWNAME names a directory, copy FILE there.
2364 Signals a `file-already-exists' error if file NEWNAME already exists,
2365 unless a third argument OK-IF-ALREADY-EXISTS is supplied and non-nil.
2366 A number as third arg means request confirmation if NEWNAME already exists.
2367 This is what happens in interactive use with M-x.
2368 Fourth arg KEEP-TIME non-nil means give the new file the same
2369 last-modified time as the old one. (This works on only some systems.)
2370 A prefix arg makes KEEP-TIME non-nil. */)
2371 (file
, newname
, ok_if_already_exists
, keep_time
)
2372 Lisp_Object file
, newname
, ok_if_already_exists
, keep_time
;
2375 char buf
[16 * 1024];
2376 struct stat st
, out_st
;
2377 Lisp_Object handler
;
2378 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2379 int count
= SPECPDL_INDEX ();
2380 int input_file_statable_p
;
2381 Lisp_Object encoded_file
, encoded_newname
;
2383 encoded_file
= encoded_newname
= Qnil
;
2384 GCPRO4 (file
, newname
, encoded_file
, encoded_newname
);
2385 CHECK_STRING (file
);
2386 CHECK_STRING (newname
);
2388 if (!NILP (Ffile_directory_p (newname
)))
2389 newname
= Fexpand_file_name (file
, newname
);
2391 newname
= Fexpand_file_name (newname
, Qnil
);
2393 file
= Fexpand_file_name (file
, Qnil
);
2395 /* If the input file name has special constructs in it,
2396 call the corresponding file handler. */
2397 handler
= Ffind_file_name_handler (file
, Qcopy_file
);
2398 /* Likewise for output file name. */
2400 handler
= Ffind_file_name_handler (newname
, Qcopy_file
);
2401 if (!NILP (handler
))
2402 RETURN_UNGCPRO (call5 (handler
, Qcopy_file
, file
, newname
,
2403 ok_if_already_exists
, keep_time
));
2405 encoded_file
= ENCODE_FILE (file
);
2406 encoded_newname
= ENCODE_FILE (newname
);
2408 if (NILP (ok_if_already_exists
)
2409 || INTEGERP (ok_if_already_exists
))
2410 barf_or_query_if_file_exists (encoded_newname
, "copy to it",
2411 INTEGERP (ok_if_already_exists
), &out_st
, 0);
2412 else if (stat (SDATA (encoded_newname
), &out_st
) < 0)
2416 if (!CopyFile (SDATA (encoded_file
),
2417 SDATA (encoded_newname
),
2419 report_file_error ("Copying file", Fcons (file
, Fcons (newname
, Qnil
)));
2420 else if (!NILP (keep_time
))
2426 EMACS_GET_TIME (now
);
2427 filename
= SDATA (encoded_newname
);
2429 /* Ensure file is writable while its modified time is set. */
2430 attributes
= GetFileAttributes (filename
);
2431 SetFileAttributes (filename
, attributes
& ~FILE_ATTRIBUTE_READONLY
);
2432 if (set_file_times (filename
, now
, now
))
2434 /* Restore original attributes. */
2435 SetFileAttributes (filename
, attributes
);
2436 Fsignal (Qfile_date_error
,
2437 Fcons (build_string ("Cannot set file date"),
2438 Fcons (newname
, Qnil
)));
2440 /* Restore original attributes. */
2441 SetFileAttributes (filename
, attributes
);
2443 #else /* not WINDOWSNT */
2444 ifd
= emacs_open (SDATA (encoded_file
), O_RDONLY
, 0);
2446 report_file_error ("Opening input file", Fcons (file
, Qnil
));
2448 record_unwind_protect (close_file_unwind
, make_number (ifd
));
2450 /* We can only copy regular files and symbolic links. Other files are not
2452 input_file_statable_p
= (fstat (ifd
, &st
) >= 0);
2454 #if !defined (DOS_NT) || __DJGPP__ > 1
2455 if (out_st
.st_mode
!= 0
2456 && st
.st_dev
== out_st
.st_dev
&& st
.st_ino
== out_st
.st_ino
)
2459 report_file_error ("Input and output files are the same",
2460 Fcons (file
, Fcons (newname
, Qnil
)));
2464 #if defined (S_ISREG) && defined (S_ISLNK)
2465 if (input_file_statable_p
)
2467 if (!(S_ISREG (st
.st_mode
)) && !(S_ISLNK (st
.st_mode
)))
2469 #if defined (EISDIR)
2470 /* Get a better looking error message. */
2473 report_file_error ("Non-regular file", Fcons (file
, Qnil
));
2476 #endif /* S_ISREG && S_ISLNK */
2479 /* Create the copy file with the same record format as the input file */
2480 ofd
= sys_creat (SDATA (encoded_newname
), 0666, ifd
);
2483 /* System's default file type was set to binary by _fmode in emacs.c. */
2484 ofd
= creat (SDATA (encoded_newname
), S_IREAD
| S_IWRITE
);
2485 #else /* not MSDOS */
2486 ofd
= creat (SDATA (encoded_newname
), 0666);
2487 #endif /* not MSDOS */
2490 report_file_error ("Opening output file", Fcons (newname
, Qnil
));
2492 record_unwind_protect (close_file_unwind
, make_number (ofd
));
2496 while ((n
= emacs_read (ifd
, buf
, sizeof buf
)) > 0)
2497 if (emacs_write (ofd
, buf
, n
) != n
)
2498 report_file_error ("I/O error", Fcons (newname
, Qnil
));
2501 /* Closing the output clobbers the file times on some systems. */
2502 if (emacs_close (ofd
) < 0)
2503 report_file_error ("I/O error", Fcons (newname
, Qnil
));
2505 if (input_file_statable_p
)
2507 if (!NILP (keep_time
))
2509 EMACS_TIME atime
, mtime
;
2510 EMACS_SET_SECS_USECS (atime
, st
.st_atime
, 0);
2511 EMACS_SET_SECS_USECS (mtime
, st
.st_mtime
, 0);
2512 if (set_file_times (SDATA (encoded_newname
),
2514 Fsignal (Qfile_date_error
,
2515 Fcons (build_string ("Cannot set file date"),
2516 Fcons (newname
, Qnil
)));
2519 chmod (SDATA (encoded_newname
), st
.st_mode
& 07777);
2521 #if defined (__DJGPP__) && __DJGPP__ > 1
2522 /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
2523 and if it can't, it tells so. Otherwise, under MSDOS we usually
2524 get only the READ bit, which will make the copied file read-only,
2525 so it's better not to chmod at all. */
2526 if ((_djstat_flags
& _STFAIL_WRITEBIT
) == 0)
2527 chmod (SDATA (encoded_newname
), st
.st_mode
& 07777);
2528 #endif /* DJGPP version 2 or newer */
2533 #endif /* WINDOWSNT */
2535 /* Discard the unwind protects. */
2536 specpdl_ptr
= specpdl
+ count
;
2542 DEFUN ("make-directory-internal", Fmake_directory_internal
,
2543 Smake_directory_internal
, 1, 1, 0,
2544 doc
: /* Create a new directory named DIRECTORY. */)
2546 Lisp_Object directory
;
2548 const unsigned char *dir
;
2549 Lisp_Object handler
;
2550 Lisp_Object encoded_dir
;
2552 CHECK_STRING (directory
);
2553 directory
= Fexpand_file_name (directory
, Qnil
);
2555 handler
= Ffind_file_name_handler (directory
, Qmake_directory_internal
);
2556 if (!NILP (handler
))
2557 return call2 (handler
, Qmake_directory_internal
, directory
);
2559 encoded_dir
= ENCODE_FILE (directory
);
2561 dir
= SDATA (encoded_dir
);
2564 if (mkdir (dir
) != 0)
2566 if (mkdir (dir
, 0777) != 0)
2568 report_file_error ("Creating directory", Flist (1, &directory
));
2573 DEFUN ("delete-directory", Fdelete_directory
, Sdelete_directory
, 1, 1, "FDelete directory: ",
2574 doc
: /* Delete the directory named DIRECTORY. */)
2576 Lisp_Object directory
;
2578 const unsigned char *dir
;
2579 Lisp_Object handler
;
2580 Lisp_Object encoded_dir
;
2582 CHECK_STRING (directory
);
2583 directory
= Fdirectory_file_name (Fexpand_file_name (directory
, Qnil
));
2585 handler
= Ffind_file_name_handler (directory
, Qdelete_directory
);
2586 if (!NILP (handler
))
2587 return call2 (handler
, Qdelete_directory
, directory
);
2589 encoded_dir
= ENCODE_FILE (directory
);
2591 dir
= SDATA (encoded_dir
);
2593 if (rmdir (dir
) != 0)
2594 report_file_error ("Removing directory", Flist (1, &directory
));
2599 DEFUN ("delete-file", Fdelete_file
, Sdelete_file
, 1, 1, "fDelete file: ",
2600 doc
: /* Delete file named FILENAME.
2601 If file has multiple names, it continues to exist with the other names. */)
2603 Lisp_Object filename
;
2605 Lisp_Object handler
;
2606 Lisp_Object encoded_file
;
2608 CHECK_STRING (filename
);
2609 filename
= Fexpand_file_name (filename
, Qnil
);
2611 handler
= Ffind_file_name_handler (filename
, Qdelete_file
);
2612 if (!NILP (handler
))
2613 return call2 (handler
, Qdelete_file
, filename
);
2615 encoded_file
= ENCODE_FILE (filename
);
2617 if (0 > unlink (SDATA (encoded_file
)))
2618 report_file_error ("Removing old name", Flist (1, &filename
));
2623 internal_delete_file_1 (ignore
)
2629 /* Delete file FILENAME, returning 1 if successful and 0 if failed. */
2632 internal_delete_file (filename
)
2633 Lisp_Object filename
;
2635 return NILP (internal_condition_case_1 (Fdelete_file
, filename
,
2636 Qt
, internal_delete_file_1
));
2639 DEFUN ("rename-file", Frename_file
, Srename_file
, 2, 3,
2640 "fRename file: \nFRename %s to file: \np",
2641 doc
: /* Rename FILE as NEWNAME. Both args strings.
2642 If file has names other than FILE, it continues to have those names.
2643 Signals a `file-already-exists' error if a file NEWNAME already exists
2644 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2645 A number as third arg means request confirmation if NEWNAME already exists.
2646 This is what happens in interactive use with M-x. */)
2647 (file
, newname
, ok_if_already_exists
)
2648 Lisp_Object file
, newname
, ok_if_already_exists
;
2651 Lisp_Object args
[2];
2653 Lisp_Object handler
;
2654 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2655 Lisp_Object encoded_file
, encoded_newname
;
2657 encoded_file
= encoded_newname
= Qnil
;
2658 GCPRO4 (file
, newname
, encoded_file
, encoded_newname
);
2659 CHECK_STRING (file
);
2660 CHECK_STRING (newname
);
2661 file
= Fexpand_file_name (file
, Qnil
);
2662 newname
= Fexpand_file_name (newname
, Qnil
);
2664 /* If the file name has special constructs in it,
2665 call the corresponding file handler. */
2666 handler
= Ffind_file_name_handler (file
, Qrename_file
);
2668 handler
= Ffind_file_name_handler (newname
, Qrename_file
);
2669 if (!NILP (handler
))
2670 RETURN_UNGCPRO (call4 (handler
, Qrename_file
,
2671 file
, newname
, ok_if_already_exists
));
2673 encoded_file
= ENCODE_FILE (file
);
2674 encoded_newname
= ENCODE_FILE (newname
);
2677 /* If the file names are identical but for the case, don't ask for
2678 confirmation: they simply want to change the letter-case of the
2680 if (NILP (Fstring_equal (Fdowncase (file
), Fdowncase (newname
))))
2682 if (NILP (ok_if_already_exists
)
2683 || INTEGERP (ok_if_already_exists
))
2684 barf_or_query_if_file_exists (encoded_newname
, "rename to it",
2685 INTEGERP (ok_if_already_exists
), 0, 0);
2687 if (0 > rename (SDATA (encoded_file
), SDATA (encoded_newname
)))
2689 if (0 > link (SDATA (encoded_file
), SDATA (encoded_newname
))
2690 || 0 > unlink (SDATA (encoded_file
)))
2695 Fcopy_file (file
, newname
,
2696 /* We have already prompted if it was an integer,
2697 so don't have copy-file prompt again. */
2698 NILP (ok_if_already_exists
) ? Qnil
: Qt
, Qt
);
2699 Fdelete_file (file
);
2706 report_file_error ("Renaming", Flist (2, args
));
2709 report_file_error ("Renaming", Flist (2, &file
));
2716 DEFUN ("add-name-to-file", Fadd_name_to_file
, Sadd_name_to_file
, 2, 3,
2717 "fAdd name to file: \nFName to add to %s: \np",
2718 doc
: /* Give FILE additional name NEWNAME. Both args strings.
2719 Signals a `file-already-exists' error if a file NEWNAME already exists
2720 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2721 A number as third arg means request confirmation if NEWNAME already exists.
2722 This is what happens in interactive use with M-x. */)
2723 (file
, newname
, ok_if_already_exists
)
2724 Lisp_Object file
, newname
, ok_if_already_exists
;
2727 Lisp_Object args
[2];
2729 Lisp_Object handler
;
2730 Lisp_Object encoded_file
, encoded_newname
;
2731 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2733 GCPRO4 (file
, newname
, encoded_file
, encoded_newname
);
2734 encoded_file
= encoded_newname
= Qnil
;
2735 CHECK_STRING (file
);
2736 CHECK_STRING (newname
);
2737 file
= Fexpand_file_name (file
, Qnil
);
2738 newname
= Fexpand_file_name (newname
, Qnil
);
2740 /* If the file name has special constructs in it,
2741 call the corresponding file handler. */
2742 handler
= Ffind_file_name_handler (file
, Qadd_name_to_file
);
2743 if (!NILP (handler
))
2744 RETURN_UNGCPRO (call4 (handler
, Qadd_name_to_file
, file
,
2745 newname
, ok_if_already_exists
));
2747 /* If the new name has special constructs in it,
2748 call the corresponding file handler. */
2749 handler
= Ffind_file_name_handler (newname
, Qadd_name_to_file
);
2750 if (!NILP (handler
))
2751 RETURN_UNGCPRO (call4 (handler
, Qadd_name_to_file
, file
,
2752 newname
, ok_if_already_exists
));
2754 encoded_file
= ENCODE_FILE (file
);
2755 encoded_newname
= ENCODE_FILE (newname
);
2757 if (NILP (ok_if_already_exists
)
2758 || INTEGERP (ok_if_already_exists
))
2759 barf_or_query_if_file_exists (encoded_newname
, "make it a new name",
2760 INTEGERP (ok_if_already_exists
), 0, 0);
2762 unlink (SDATA (newname
));
2763 if (0 > link (SDATA (encoded_file
), SDATA (encoded_newname
)))
2768 report_file_error ("Adding new name", Flist (2, args
));
2770 report_file_error ("Adding new name", Flist (2, &file
));
2779 DEFUN ("make-symbolic-link", Fmake_symbolic_link
, Smake_symbolic_link
, 2, 3,
2780 "FMake symbolic link to file: \nFMake symbolic link to file %s: \np",
2781 doc
: /* Make a symbolic link to FILENAME, named LINKNAME. Both args strings.
2782 Signals a `file-already-exists' error if a file LINKNAME already exists
2783 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2784 A number as third arg means request confirmation if LINKNAME already exists.
2785 This happens for interactive use with M-x. */)
2786 (filename
, linkname
, ok_if_already_exists
)
2787 Lisp_Object filename
, linkname
, ok_if_already_exists
;
2790 Lisp_Object args
[2];
2792 Lisp_Object handler
;
2793 Lisp_Object encoded_filename
, encoded_linkname
;
2794 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2796 GCPRO4 (filename
, linkname
, encoded_filename
, encoded_linkname
);
2797 encoded_filename
= encoded_linkname
= Qnil
;
2798 CHECK_STRING (filename
);
2799 CHECK_STRING (linkname
);
2800 /* If the link target has a ~, we must expand it to get
2801 a truly valid file name. Otherwise, do not expand;
2802 we want to permit links to relative file names. */
2803 if (SREF (filename
, 0) == '~')
2804 filename
= Fexpand_file_name (filename
, Qnil
);
2805 linkname
= Fexpand_file_name (linkname
, Qnil
);
2807 /* If the file name has special constructs in it,
2808 call the corresponding file handler. */
2809 handler
= Ffind_file_name_handler (filename
, Qmake_symbolic_link
);
2810 if (!NILP (handler
))
2811 RETURN_UNGCPRO (call4 (handler
, Qmake_symbolic_link
, filename
,
2812 linkname
, ok_if_already_exists
));
2814 /* If the new link name has special constructs in it,
2815 call the corresponding file handler. */
2816 handler
= Ffind_file_name_handler (linkname
, Qmake_symbolic_link
);
2817 if (!NILP (handler
))
2818 RETURN_UNGCPRO (call4 (handler
, Qmake_symbolic_link
, filename
,
2819 linkname
, ok_if_already_exists
));
2821 encoded_filename
= ENCODE_FILE (filename
);
2822 encoded_linkname
= ENCODE_FILE (linkname
);
2824 if (NILP (ok_if_already_exists
)
2825 || INTEGERP (ok_if_already_exists
))
2826 barf_or_query_if_file_exists (encoded_linkname
, "make it a link",
2827 INTEGERP (ok_if_already_exists
), 0, 0);
2828 if (0 > symlink (SDATA (encoded_filename
),
2829 SDATA (encoded_linkname
)))
2831 /* If we didn't complain already, silently delete existing file. */
2832 if (errno
== EEXIST
)
2834 unlink (SDATA (encoded_linkname
));
2835 if (0 <= symlink (SDATA (encoded_filename
),
2836 SDATA (encoded_linkname
)))
2846 report_file_error ("Making symbolic link", Flist (2, args
));
2848 report_file_error ("Making symbolic link", Flist (2, &filename
));
2854 #endif /* S_IFLNK */
2858 DEFUN ("define-logical-name", Fdefine_logical_name
, Sdefine_logical_name
,
2859 2, 2, "sDefine logical name: \nsDefine logical name %s as: ",
2860 doc
: /* Define the job-wide logical name NAME to have the value STRING.
2861 If STRING is nil or a null string, the logical name NAME is deleted. */)
2866 CHECK_STRING (name
);
2868 delete_logical_name (SDATA (name
));
2871 CHECK_STRING (string
);
2873 if (SCHARS (string
) == 0)
2874 delete_logical_name (SDATA (name
));
2876 define_logical_name (SDATA (name
), SDATA (string
));
2885 DEFUN ("sysnetunam", Fsysnetunam
, Ssysnetunam
, 2, 2, 0,
2886 doc
: /* Open a network connection to PATH using LOGIN as the login string. */)
2888 Lisp_Object path
, login
;
2892 CHECK_STRING (path
);
2893 CHECK_STRING (login
);
2895 netresult
= netunam (SDATA (path
), SDATA (login
));
2897 if (netresult
== -1)
2902 #endif /* HPUX_NET */
2904 DEFUN ("file-name-absolute-p", Ffile_name_absolute_p
, Sfile_name_absolute_p
,
2906 doc
: /* Return t if file FILENAME specifies an absolute file name.
2907 On Unix, this is a name starting with a `/' or a `~'. */)
2909 Lisp_Object filename
;
2911 const unsigned char *ptr
;
2913 CHECK_STRING (filename
);
2914 ptr
= SDATA (filename
);
2915 if (IS_DIRECTORY_SEP (*ptr
) || *ptr
== '~'
2917 /* ??? This criterion is probably wrong for '<'. */
2918 || index (ptr
, ':') || index (ptr
, '<')
2919 || (*ptr
== '[' && (ptr
[1] != '-' || (ptr
[2] != '.' && ptr
[2] != ']'))
2923 || (IS_DRIVE (*ptr
) && ptr
[1] == ':' && IS_DIRECTORY_SEP (ptr
[2]))
2931 /* Return nonzero if file FILENAME exists and can be executed. */
2934 check_executable (filename
)
2938 int len
= strlen (filename
);
2941 if (stat (filename
, &st
) < 0)
2943 #if defined (WINDOWSNT) || (defined (MSDOS) && __DJGPP__ > 1)
2944 return ((st
.st_mode
& S_IEXEC
) != 0);
2946 return (S_ISREG (st
.st_mode
)
2948 && (stricmp ((suffix
= filename
+ len
-4), ".com") == 0
2949 || stricmp (suffix
, ".exe") == 0
2950 || stricmp (suffix
, ".bat") == 0)
2951 || (st
.st_mode
& S_IFMT
) == S_IFDIR
);
2952 #endif /* not WINDOWSNT */
2953 #else /* not DOS_NT */
2954 #ifdef HAVE_EUIDACCESS
2955 return (euidaccess (filename
, 1) >= 0);
2957 /* Access isn't quite right because it uses the real uid
2958 and we really want to test with the effective uid.
2959 But Unix doesn't give us a right way to do it. */
2960 return (access (filename
, 1) >= 0);
2962 #endif /* not DOS_NT */
2965 /* Return nonzero if file FILENAME exists and can be written. */
2968 check_writable (filename
)
2973 if (stat (filename
, &st
) < 0)
2975 return (st
.st_mode
& S_IWRITE
|| (st
.st_mode
& S_IFMT
) == S_IFDIR
);
2976 #else /* not MSDOS */
2977 #ifdef HAVE_EUIDACCESS
2978 return (euidaccess (filename
, 2) >= 0);
2980 /* Access isn't quite right because it uses the real uid
2981 and we really want to test with the effective uid.
2982 But Unix doesn't give us a right way to do it.
2983 Opening with O_WRONLY could work for an ordinary file,
2984 but would lose for directories. */
2985 return (access (filename
, 2) >= 0);
2987 #endif /* not MSDOS */
2990 DEFUN ("file-exists-p", Ffile_exists_p
, Sfile_exists_p
, 1, 1, 0,
2991 doc
: /* Return t if file FILENAME exists. (This does not mean you can read it.)
2992 See also `file-readable-p' and `file-attributes'. */)
2994 Lisp_Object filename
;
2996 Lisp_Object absname
;
2997 Lisp_Object handler
;
2998 struct stat statbuf
;
3000 CHECK_STRING (filename
);
3001 absname
= Fexpand_file_name (filename
, Qnil
);
3003 /* If the file name has special constructs in it,
3004 call the corresponding file handler. */
3005 handler
= Ffind_file_name_handler (absname
, Qfile_exists_p
);
3006 if (!NILP (handler
))
3007 return call2 (handler
, Qfile_exists_p
, absname
);
3009 absname
= ENCODE_FILE (absname
);
3011 return (stat (SDATA (absname
), &statbuf
) >= 0) ? Qt
: Qnil
;
3014 DEFUN ("file-executable-p", Ffile_executable_p
, Sfile_executable_p
, 1, 1, 0,
3015 doc
: /* Return t if FILENAME can be executed by you.
3016 For a directory, this means you can access files in that directory. */)
3018 Lisp_Object filename
;
3020 Lisp_Object absname
;
3021 Lisp_Object handler
;
3023 CHECK_STRING (filename
);
3024 absname
= Fexpand_file_name (filename
, Qnil
);
3026 /* If the file name has special constructs in it,
3027 call the corresponding file handler. */
3028 handler
= Ffind_file_name_handler (absname
, Qfile_executable_p
);
3029 if (!NILP (handler
))
3030 return call2 (handler
, Qfile_executable_p
, absname
);
3032 absname
= ENCODE_FILE (absname
);
3034 return (check_executable (SDATA (absname
)) ? Qt
: Qnil
);
3037 DEFUN ("file-readable-p", Ffile_readable_p
, Sfile_readable_p
, 1, 1, 0,
3038 doc
: /* Return t if file FILENAME exists and you can read it.
3039 See also `file-exists-p' and `file-attributes'. */)
3041 Lisp_Object filename
;
3043 Lisp_Object absname
;
3044 Lisp_Object handler
;
3047 struct stat statbuf
;
3049 CHECK_STRING (filename
);
3050 absname
= Fexpand_file_name (filename
, Qnil
);
3052 /* If the file name has special constructs in it,
3053 call the corresponding file handler. */
3054 handler
= Ffind_file_name_handler (absname
, Qfile_readable_p
);
3055 if (!NILP (handler
))
3056 return call2 (handler
, Qfile_readable_p
, absname
);
3058 absname
= ENCODE_FILE (absname
);
3060 #if defined(DOS_NT) || defined(macintosh)
3061 /* Under MS-DOS, Windows, and Macintosh, open does not work for
3063 if (access (SDATA (absname
), 0) == 0)
3066 #else /* not DOS_NT and not macintosh */
3068 #if defined (S_ISFIFO) && defined (O_NONBLOCK)
3069 /* Opening a fifo without O_NONBLOCK can wait.
3070 We don't want to wait. But we don't want to mess wth O_NONBLOCK
3071 except in the case of a fifo, on a system which handles it. */
3072 desc
= stat (SDATA (absname
), &statbuf
);
3075 if (S_ISFIFO (statbuf
.st_mode
))
3076 flags
|= O_NONBLOCK
;
3078 desc
= emacs_open (SDATA (absname
), flags
, 0);
3083 #endif /* not DOS_NT and not macintosh */
3086 /* Having this before file-symlink-p mysteriously caused it to be forgotten
3088 DEFUN ("file-writable-p", Ffile_writable_p
, Sfile_writable_p
, 1, 1, 0,
3089 doc
: /* Return t if file FILENAME can be written or created by you. */)
3091 Lisp_Object filename
;
3093 Lisp_Object absname
, dir
, encoded
;
3094 Lisp_Object handler
;
3095 struct stat statbuf
;
3097 CHECK_STRING (filename
);
3098 absname
= Fexpand_file_name (filename
, Qnil
);
3100 /* If the file name has special constructs in it,
3101 call the corresponding file handler. */
3102 handler
= Ffind_file_name_handler (absname
, Qfile_writable_p
);
3103 if (!NILP (handler
))
3104 return call2 (handler
, Qfile_writable_p
, absname
);
3106 encoded
= ENCODE_FILE (absname
);
3107 if (stat (SDATA (encoded
), &statbuf
) >= 0)
3108 return (check_writable (SDATA (encoded
))
3111 dir
= Ffile_name_directory (absname
);
3114 dir
= Fdirectory_file_name (dir
);
3118 dir
= Fdirectory_file_name (dir
);
3121 dir
= ENCODE_FILE (dir
);
3123 /* The read-only attribute of the parent directory doesn't affect
3124 whether a file or directory can be created within it. Some day we
3125 should check ACLs though, which do affect this. */
3126 if (stat (SDATA (dir
), &statbuf
) < 0)
3128 return (statbuf
.st_mode
& S_IFMT
) == S_IFDIR
? Qt
: Qnil
;
3130 return (check_writable (!NILP (dir
) ? (char *) SDATA (dir
) : "")
3135 DEFUN ("access-file", Faccess_file
, Saccess_file
, 2, 2, 0,
3136 doc
: /* Access file FILENAME, and get an error if that does not work.
3137 The second argument STRING is used in the error message.
3138 If there is no error, we return nil. */)
3140 Lisp_Object filename
, string
;
3142 Lisp_Object handler
, encoded_filename
, absname
;
3145 CHECK_STRING (filename
);
3146 absname
= Fexpand_file_name (filename
, Qnil
);
3148 CHECK_STRING (string
);
3150 /* If the file name has special constructs in it,
3151 call the corresponding file handler. */
3152 handler
= Ffind_file_name_handler (absname
, Qaccess_file
);
3153 if (!NILP (handler
))
3154 return call3 (handler
, Qaccess_file
, absname
, string
);
3156 encoded_filename
= ENCODE_FILE (absname
);
3158 fd
= emacs_open (SDATA (encoded_filename
), O_RDONLY
, 0);
3160 report_file_error (SDATA (string
), Fcons (filename
, Qnil
));
3166 DEFUN ("file-symlink-p", Ffile_symlink_p
, Sfile_symlink_p
, 1, 1, 0,
3167 doc
: /* Return non-nil if file FILENAME is the name of a symbolic link.
3168 The value is the name of the file to which it is linked.
3169 Otherwise returns nil. */)
3171 Lisp_Object filename
;
3178 Lisp_Object handler
;
3180 CHECK_STRING (filename
);
3181 filename
= Fexpand_file_name (filename
, Qnil
);
3183 /* If the file name has special constructs in it,
3184 call the corresponding file handler. */
3185 handler
= Ffind_file_name_handler (filename
, Qfile_symlink_p
);
3186 if (!NILP (handler
))
3187 return call2 (handler
, Qfile_symlink_p
, filename
);
3189 filename
= ENCODE_FILE (filename
);
3196 buf
= (char *) xrealloc (buf
, bufsize
);
3197 bzero (buf
, bufsize
);
3200 valsize
= readlink (SDATA (filename
), buf
, bufsize
);
3204 /* HP-UX reports ERANGE if buffer is too small. */
3205 if (errno
== ERANGE
)
3215 while (valsize
>= bufsize
);
3217 val
= make_string (buf
, valsize
);
3218 if (buf
[0] == '/' && index (buf
, ':'))
3219 val
= concat2 (build_string ("/:"), val
);
3221 val
= DECODE_FILE (val
);
3223 #else /* not S_IFLNK */
3225 #endif /* not S_IFLNK */
3228 DEFUN ("file-directory-p", Ffile_directory_p
, Sfile_directory_p
, 1, 1, 0,
3229 doc
: /* Return t if FILENAME names an existing directory.
3230 Symbolic links to directories count as directories.
3231 See `file-symlink-p' to distinguish symlinks. */)
3233 Lisp_Object filename
;
3235 register Lisp_Object absname
;
3237 Lisp_Object handler
;
3239 absname
= expand_and_dir_to_file (filename
, current_buffer
->directory
);
3241 /* If the file name has special constructs in it,
3242 call the corresponding file handler. */
3243 handler
= Ffind_file_name_handler (absname
, Qfile_directory_p
);
3244 if (!NILP (handler
))
3245 return call2 (handler
, Qfile_directory_p
, absname
);
3247 absname
= ENCODE_FILE (absname
);
3249 if (stat (SDATA (absname
), &st
) < 0)
3251 return (st
.st_mode
& S_IFMT
) == S_IFDIR
? Qt
: Qnil
;
3254 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p
, Sfile_accessible_directory_p
, 1, 1, 0,
3255 doc
: /* Return t if file FILENAME names a directory you can open.
3256 For the value to be t, FILENAME must specify the name of a directory as a file,
3257 and the directory must allow you to open files in it. In order to use a
3258 directory as a buffer's current directory, this predicate must return true.
3259 A directory name spec may be given instead; then the value is t
3260 if the directory so specified exists and really is a readable and
3261 searchable directory. */)
3263 Lisp_Object filename
;
3265 Lisp_Object handler
;
3267 struct gcpro gcpro1
;
3269 /* If the file name has special constructs in it,
3270 call the corresponding file handler. */
3271 handler
= Ffind_file_name_handler (filename
, Qfile_accessible_directory_p
);
3272 if (!NILP (handler
))
3273 return call2 (handler
, Qfile_accessible_directory_p
, filename
);
3275 /* It's an unlikely combination, but yes we really do need to gcpro:
3276 Suppose that file-accessible-directory-p has no handler, but
3277 file-directory-p does have a handler; this handler causes a GC which
3278 relocates the string in `filename'; and finally file-directory-p
3279 returns non-nil. Then we would end up passing a garbaged string
3280 to file-executable-p. */
3282 tem
= (NILP (Ffile_directory_p (filename
))
3283 || NILP (Ffile_executable_p (filename
)));
3285 return tem
? Qnil
: Qt
;
3288 DEFUN ("file-regular-p", Ffile_regular_p
, Sfile_regular_p
, 1, 1, 0,
3289 doc
: /* Return t if file FILENAME is the name of a regular file.
3290 This is the sort of file that holds an ordinary stream of data bytes. */)
3292 Lisp_Object filename
;
3294 register Lisp_Object absname
;
3296 Lisp_Object handler
;
3298 absname
= expand_and_dir_to_file (filename
, current_buffer
->directory
);
3300 /* If the file name has special constructs in it,
3301 call the corresponding file handler. */
3302 handler
= Ffind_file_name_handler (absname
, Qfile_regular_p
);
3303 if (!NILP (handler
))
3304 return call2 (handler
, Qfile_regular_p
, absname
);
3306 absname
= ENCODE_FILE (absname
);
3311 Lisp_Object tem
= Vw32_get_true_file_attributes
;
3313 /* Tell stat to use expensive method to get accurate info. */
3314 Vw32_get_true_file_attributes
= Qt
;
3315 result
= stat (SDATA (absname
), &st
);
3316 Vw32_get_true_file_attributes
= tem
;
3320 return (st
.st_mode
& S_IFMT
) == S_IFREG
? Qt
: Qnil
;
3323 if (stat (SDATA (absname
), &st
) < 0)
3325 return (st
.st_mode
& S_IFMT
) == S_IFREG
? Qt
: Qnil
;
3329 DEFUN ("file-modes", Ffile_modes
, Sfile_modes
, 1, 1, 0,
3330 doc
: /* Return mode bits of file named FILENAME, as an integer. */)
3332 Lisp_Object filename
;
3334 Lisp_Object absname
;
3336 Lisp_Object handler
;
3338 absname
= expand_and_dir_to_file (filename
, current_buffer
->directory
);
3340 /* If the file name has special constructs in it,
3341 call the corresponding file handler. */
3342 handler
= Ffind_file_name_handler (absname
, Qfile_modes
);
3343 if (!NILP (handler
))
3344 return call2 (handler
, Qfile_modes
, absname
);
3346 absname
= ENCODE_FILE (absname
);
3348 if (stat (SDATA (absname
), &st
) < 0)
3350 #if defined (MSDOS) && __DJGPP__ < 2
3351 if (check_executable (SDATA (absname
)))
3352 st
.st_mode
|= S_IEXEC
;
3353 #endif /* MSDOS && __DJGPP__ < 2 */
3355 return make_number (st
.st_mode
& 07777);
3358 DEFUN ("set-file-modes", Fset_file_modes
, Sset_file_modes
, 2, 2, 0,
3359 doc
: /* Set mode bits of file named FILENAME to MODE (an integer).
3360 Only the 12 low bits of MODE are used. */)
3362 Lisp_Object filename
, mode
;
3364 Lisp_Object absname
, encoded_absname
;
3365 Lisp_Object handler
;
3367 absname
= Fexpand_file_name (filename
, current_buffer
->directory
);
3368 CHECK_NUMBER (mode
);
3370 /* If the file name has special constructs in it,
3371 call the corresponding file handler. */
3372 handler
= Ffind_file_name_handler (absname
, Qset_file_modes
);
3373 if (!NILP (handler
))
3374 return call3 (handler
, Qset_file_modes
, absname
, mode
);
3376 encoded_absname
= ENCODE_FILE (absname
);
3378 if (chmod (SDATA (encoded_absname
), XINT (mode
)) < 0)
3379 report_file_error ("Doing chmod", Fcons (absname
, Qnil
));
3384 DEFUN ("set-default-file-modes", Fset_default_file_modes
, Sset_default_file_modes
, 1, 1, 0,
3385 doc
: /* Set the file permission bits for newly created files.
3386 The argument MODE should be an integer; only the low 9 bits are used.
3387 This setting is inherited by subprocesses. */)
3391 CHECK_NUMBER (mode
);
3393 umask ((~ XINT (mode
)) & 0777);
3398 DEFUN ("default-file-modes", Fdefault_file_modes
, Sdefault_file_modes
, 0, 0, 0,
3399 doc
: /* Return the default file protection for created files.
3400 The value is an integer. */)
3406 realmask
= umask (0);
3409 XSETINT (value
, (~ realmask
) & 0777);
3419 DEFUN ("unix-sync", Funix_sync
, Sunix_sync
, 0, 0, "",
3420 doc
: /* Tell Unix to finish all pending disk updates. */)
3429 DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p
, Sfile_newer_than_file_p
, 2, 2, 0,
3430 doc
: /* Return t if file FILE1 is newer than file FILE2.
3431 If FILE1 does not exist, the answer is nil;
3432 otherwise, if FILE2 does not exist, the answer is t. */)
3434 Lisp_Object file1
, file2
;
3436 Lisp_Object absname1
, absname2
;
3439 Lisp_Object handler
;
3440 struct gcpro gcpro1
, gcpro2
;
3442 CHECK_STRING (file1
);
3443 CHECK_STRING (file2
);
3446 GCPRO2 (absname1
, file2
);
3447 absname1
= expand_and_dir_to_file (file1
, current_buffer
->directory
);
3448 absname2
= expand_and_dir_to_file (file2
, current_buffer
->directory
);
3451 /* If the file name has special constructs in it,
3452 call the corresponding file handler. */
3453 handler
= Ffind_file_name_handler (absname1
, Qfile_newer_than_file_p
);
3455 handler
= Ffind_file_name_handler (absname2
, Qfile_newer_than_file_p
);
3456 if (!NILP (handler
))
3457 return call3 (handler
, Qfile_newer_than_file_p
, absname1
, absname2
);
3459 GCPRO2 (absname1
, absname2
);
3460 absname1
= ENCODE_FILE (absname1
);
3461 absname2
= ENCODE_FILE (absname2
);
3464 if (stat (SDATA (absname1
), &st
) < 0)
3467 mtime1
= st
.st_mtime
;
3469 if (stat (SDATA (absname2
), &st
) < 0)
3472 return (mtime1
> st
.st_mtime
) ? Qt
: Qnil
;
3476 Lisp_Object Qfind_buffer_file_type
;
3479 #ifndef READ_BUF_SIZE
3480 #define READ_BUF_SIZE (64 << 10)
3483 extern void adjust_markers_for_delete
P_ ((int, int, int, int));
3485 /* This function is called after Lisp functions to decide a coding
3486 system are called, or when they cause an error. Before they are
3487 called, the current buffer is set unibyte and it contains only a
3488 newly inserted text (thus the buffer was empty before the
3491 The functions may set markers, overlays, text properties, or even
3492 alter the buffer contents, change the current buffer.
3494 Here, we reset all those changes by:
3495 o set back the current buffer.
3496 o move all markers and overlays to BEG.
3497 o remove all text properties.
3498 o set back the buffer multibyteness. */
3501 decide_coding_unwind (unwind_data
)
3502 Lisp_Object unwind_data
;
3504 Lisp_Object multibyte
, undo_list
, buffer
;
3506 multibyte
= XCAR (unwind_data
);
3507 unwind_data
= XCDR (unwind_data
);
3508 undo_list
= XCAR (unwind_data
);
3509 buffer
= XCDR (unwind_data
);
3511 if (current_buffer
!= XBUFFER (buffer
))
3512 set_buffer_internal (XBUFFER (buffer
));
3513 adjust_markers_for_delete (BEG
, BEG_BYTE
, Z
, Z_BYTE
);
3514 adjust_overlays_for_delete (BEG
, Z
- BEG
);
3515 BUF_INTERVALS (current_buffer
) = 0;
3516 TEMP_SET_PT_BOTH (BEG
, BEG_BYTE
);
3518 /* Now we are safe to change the buffer's multibyteness directly. */
3519 current_buffer
->enable_multibyte_characters
= multibyte
;
3520 current_buffer
->undo_list
= undo_list
;
3526 /* Used to pass values from insert-file-contents to read_non_regular. */
3528 static int non_regular_fd
;
3529 static int non_regular_inserted
;
3530 static int non_regular_nbytes
;
3533 /* Read from a non-regular file.
3534 Read non_regular_trytry bytes max from non_regular_fd.
3535 Non_regular_inserted specifies where to put the read bytes.
3536 Value is the number of bytes read. */
3545 nbytes
= emacs_read (non_regular_fd
,
3546 BEG_ADDR
+ PT_BYTE
- BEG_BYTE
+ non_regular_inserted
,
3547 non_regular_nbytes
);
3549 return make_number (nbytes
);
3553 /* Condition-case handler used when reading from non-regular files
3554 in insert-file-contents. */
3557 read_non_regular_quit ()
3563 DEFUN ("insert-file-contents", Finsert_file_contents
, Sinsert_file_contents
,
3565 doc
: /* Insert contents of file FILENAME after point.
3566 Returns list of absolute file name and number of bytes inserted.
3567 If second argument VISIT is non-nil, the buffer's visited filename
3568 and last save file modtime are set, and it is marked unmodified.
3569 If visiting and the file does not exist, visiting is completed
3570 before the error is signaled.
3571 The optional third and fourth arguments BEG and END
3572 specify what portion of the file to insert.
3573 These arguments count bytes in the file, not characters in the buffer.
3574 If VISIT is non-nil, BEG and END must be nil.
3576 If optional fifth argument REPLACE is non-nil,
3577 it means replace the current buffer contents (in the accessible portion)
3578 with the file contents. This is better than simply deleting and inserting
3579 the whole thing because (1) it preserves some marker positions
3580 and (2) it puts less data in the undo list.
3581 When REPLACE is non-nil, the value is the number of characters actually read,
3582 which is often less than the number of characters to be read.
3584 This does code conversion according to the value of
3585 `coding-system-for-read' or `file-coding-system-alist',
3586 and sets the variable `last-coding-system-used' to the coding system
3588 (filename
, visit
, beg
, end
, replace
)
3589 Lisp_Object filename
, visit
, beg
, end
, replace
;
3594 register int how_much
;
3595 register int unprocessed
;
3596 int count
= SPECPDL_INDEX ();
3597 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3598 Lisp_Object handler
, val
, insval
, orig_filename
;
3601 int not_regular
= 0;
3602 unsigned char read_buf
[READ_BUF_SIZE
];
3603 struct coding_system coding
;
3604 unsigned char buffer
[1 << 14];
3605 int replace_handled
= 0;
3606 int set_coding_system
= 0;
3607 int coding_system_decided
= 0;
3610 if (current_buffer
->base_buffer
&& ! NILP (visit
))
3611 error ("Cannot do file visiting in an indirect buffer");
3613 if (!NILP (current_buffer
->read_only
))
3614 Fbarf_if_buffer_read_only ();
3618 orig_filename
= Qnil
;
3620 GCPRO4 (filename
, val
, p
, orig_filename
);
3622 CHECK_STRING (filename
);
3623 filename
= Fexpand_file_name (filename
, Qnil
);
3625 /* If the file name has special constructs in it,
3626 call the corresponding file handler. */
3627 handler
= Ffind_file_name_handler (filename
, Qinsert_file_contents
);
3628 if (!NILP (handler
))
3630 val
= call6 (handler
, Qinsert_file_contents
, filename
,
3631 visit
, beg
, end
, replace
);
3632 if (CONSP (val
) && CONSP (XCDR (val
)))
3633 inserted
= XINT (XCAR (XCDR (val
)));
3637 orig_filename
= filename
;
3638 filename
= ENCODE_FILE (filename
);
3644 Lisp_Object tem
= Vw32_get_true_file_attributes
;
3646 /* Tell stat to use expensive method to get accurate info. */
3647 Vw32_get_true_file_attributes
= Qt
;
3648 total
= stat (SDATA (filename
), &st
);
3649 Vw32_get_true_file_attributes
= tem
;
3654 if (stat (SDATA (filename
), &st
) < 0)
3656 if ((fd
= emacs_open (SDATA (filename
), O_RDONLY
, 0)) < 0
3657 || fstat (fd
, &st
) < 0)
3658 #endif /* not APOLLO */
3659 #endif /* WINDOWSNT */
3661 if (fd
>= 0) emacs_close (fd
);
3664 report_file_error ("Opening input file", Fcons (orig_filename
, Qnil
));
3667 if (!NILP (Vcoding_system_for_read
))
3668 Fset (Qbuffer_file_coding_system
, Vcoding_system_for_read
);
3673 /* This code will need to be changed in order to work on named
3674 pipes, and it's probably just not worth it. So we should at
3675 least signal an error. */
3676 if (!S_ISREG (st
.st_mode
))
3683 if (! NILP (replace
) || ! NILP (beg
) || ! NILP (end
))
3684 Fsignal (Qfile_error
,
3685 Fcons (build_string ("not a regular file"),
3686 Fcons (orig_filename
, Qnil
)));
3691 if ((fd
= emacs_open (SDATA (filename
), O_RDONLY
, 0)) < 0)
3694 /* Replacement should preserve point as it preserves markers. */
3695 if (!NILP (replace
))
3696 record_unwind_protect (restore_point_unwind
, Fpoint_marker ());
3698 record_unwind_protect (close_file_unwind
, make_number (fd
));
3700 /* Supposedly happens on VMS. */
3701 if (! not_regular
&& st
.st_size
< 0)
3702 error ("File size is negative");
3704 /* Prevent redisplay optimizations. */
3705 current_buffer
->clip_changed
= 1;
3709 if (!NILP (beg
) || !NILP (end
))
3710 error ("Attempt to visit less than an entire file");
3711 if (BEG
< Z
&& NILP (replace
))
3712 error ("Cannot do file visiting in a non-empty buffer");
3718 XSETFASTINT (beg
, 0);
3726 XSETINT (end
, st
.st_size
);
3728 /* Arithmetic overflow can occur if an Emacs integer cannot
3729 represent the file size, or if the calculations below
3730 overflow. The calculations below double the file size
3731 twice, so check that it can be multiplied by 4 safely. */
3732 if (XINT (end
) != st
.st_size
3733 || ((int) st
.st_size
* 4) / 4 != st
.st_size
)
3734 error ("Maximum buffer size exceeded");
3736 /* The file size returned from stat may be zero, but data
3737 may be readable nonetheless, for example when this is a
3738 file in the /proc filesystem. */
3739 if (st
.st_size
== 0)
3740 XSETINT (end
, READ_BUF_SIZE
);
3746 /* Decide the coding system to use for reading the file now
3747 because we can't use an optimized method for handling
3748 `coding:' tag if the current buffer is not empty. */
3752 if (!NILP (Vcoding_system_for_read
))
3753 val
= Vcoding_system_for_read
;
3754 else if (! NILP (replace
))
3755 /* In REPLACE mode, we can use the same coding system
3756 that was used to visit the file. */
3757 val
= current_buffer
->buffer_file_coding_system
;
3760 /* Don't try looking inside a file for a coding system
3761 specification if it is not seekable. */
3762 if (! not_regular
&& ! NILP (Vset_auto_coding_function
))
3764 /* Find a coding system specified in the heading two
3765 lines or in the tailing several lines of the file.
3766 We assume that the 1K-byte and 3K-byte for heading
3767 and tailing respectively are sufficient for this
3771 if (st
.st_size
<= (1024 * 4))
3772 nread
= emacs_read (fd
, read_buf
, 1024 * 4);
3775 nread
= emacs_read (fd
, read_buf
, 1024);
3778 if (lseek (fd
, st
.st_size
- (1024 * 3), 0) < 0)
3779 report_file_error ("Setting file position",
3780 Fcons (orig_filename
, Qnil
));
3781 nread
+= emacs_read (fd
, read_buf
+ nread
, 1024 * 3);
3786 error ("IO error reading %s: %s",
3787 SDATA (orig_filename
), emacs_strerror (errno
));
3790 struct buffer
*prev
= current_buffer
;
3794 record_unwind_protect (Fset_buffer
, Fcurrent_buffer ());
3796 buffer
= Fget_buffer_create (build_string (" *code-converting-work*"));
3797 buf
= XBUFFER (buffer
);
3799 buf
->directory
= current_buffer
->directory
;
3800 buf
->read_only
= Qnil
;
3801 buf
->filename
= Qnil
;
3802 buf
->undo_list
= Qt
;
3803 buf
->overlays_before
= Qnil
;
3804 buf
->overlays_after
= Qnil
;
3806 set_buffer_internal (buf
);
3808 buf
->enable_multibyte_characters
= Qnil
;
3810 insert_1_both (read_buf
, nread
, nread
, 0, 0, 0);
3811 TEMP_SET_PT_BOTH (BEG
, BEG_BYTE
);
3812 val
= call2 (Vset_auto_coding_function
,
3813 filename
, make_number (nread
));
3814 set_buffer_internal (prev
);
3816 /* Discard the unwind protect for recovering the
3820 /* Rewind the file for the actual read done later. */
3821 if (lseek (fd
, 0, 0) < 0)
3822 report_file_error ("Setting file position",
3823 Fcons (orig_filename
, Qnil
));
3829 /* If we have not yet decided a coding system, check
3830 file-coding-system-alist. */
3831 Lisp_Object args
[6], coding_systems
;
3833 args
[0] = Qinsert_file_contents
, args
[1] = orig_filename
;
3834 args
[2] = visit
, args
[3] = beg
, args
[4] = end
, args
[5] = replace
;
3835 coding_systems
= Ffind_operation_coding_system (6, args
);
3836 if (CONSP (coding_systems
))
3837 val
= XCAR (coding_systems
);
3841 setup_coding_system (Fcheck_coding_system (val
), &coding
);
3842 /* Ensure we set Vlast_coding_system_used. */
3843 set_coding_system
= 1;
3845 if (NILP (current_buffer
->enable_multibyte_characters
)
3847 /* We must suppress all character code conversion except for
3848 end-of-line conversion. */
3849 setup_raw_text_coding_system (&coding
);
3851 coding
.src_multibyte
= 0;
3852 coding
.dst_multibyte
3853 = !NILP (current_buffer
->enable_multibyte_characters
);
3854 coding_system_decided
= 1;
3857 /* If requested, replace the accessible part of the buffer
3858 with the file contents. Avoid replacing text at the
3859 beginning or end of the buffer that matches the file contents;
3860 that preserves markers pointing to the unchanged parts.
3862 Here we implement this feature in an optimized way
3863 for the case where code conversion is NOT needed.
3864 The following if-statement handles the case of conversion
3865 in a less optimal way.
3867 If the code conversion is "automatic" then we try using this
3868 method and hope for the best.
3869 But if we discover the need for conversion, we give up on this method
3870 and let the following if-statement handle the replace job. */
3873 && !(coding
.common_flags
& CODING_REQUIRE_DECODING_MASK
))
3875 /* same_at_start and same_at_end count bytes,
3876 because file access counts bytes
3877 and BEG and END count bytes. */
3878 int same_at_start
= BEGV_BYTE
;
3879 int same_at_end
= ZV_BYTE
;
3881 /* There is still a possibility we will find the need to do code
3882 conversion. If that happens, we set this variable to 1 to
3883 give up on handling REPLACE in the optimized way. */
3884 int giveup_match_end
= 0;
3886 if (XINT (beg
) != 0)
3888 if (lseek (fd
, XINT (beg
), 0) < 0)
3889 report_file_error ("Setting file position",
3890 Fcons (orig_filename
, Qnil
));
3895 /* Count how many chars at the start of the file
3896 match the text at the beginning of the buffer. */
3901 nread
= emacs_read (fd
, buffer
, sizeof buffer
);
3903 error ("IO error reading %s: %s",
3904 SDATA (orig_filename
), emacs_strerror (errno
));
3905 else if (nread
== 0)
3908 if (coding
.type
== coding_type_undecided
)
3909 detect_coding (&coding
, buffer
, nread
);
3910 if (coding
.common_flags
& CODING_REQUIRE_DECODING_MASK
)
3911 /* We found that the file should be decoded somehow.
3912 Let's give up here. */
3914 giveup_match_end
= 1;
3918 if (coding
.eol_type
== CODING_EOL_UNDECIDED
)
3919 detect_eol (&coding
, buffer
, nread
);
3920 if (coding
.eol_type
!= CODING_EOL_UNDECIDED
3921 && coding
.eol_type
!= CODING_EOL_LF
)
3922 /* We found that the format of eol should be decoded.
3923 Let's give up here. */
3925 giveup_match_end
= 1;
3930 while (bufpos
< nread
&& same_at_start
< ZV_BYTE
3931 && FETCH_BYTE (same_at_start
) == buffer
[bufpos
])
3932 same_at_start
++, bufpos
++;
3933 /* If we found a discrepancy, stop the scan.
3934 Otherwise loop around and scan the next bufferful. */
3935 if (bufpos
!= nread
)
3939 /* If the file matches the buffer completely,
3940 there's no need to replace anything. */
3941 if (same_at_start
- BEGV_BYTE
== XINT (end
))
3945 /* Truncate the buffer to the size of the file. */
3946 del_range_1 (same_at_start
, same_at_end
, 0, 0);
3951 /* Count how many chars at the end of the file
3952 match the text at the end of the buffer. But, if we have
3953 already found that decoding is necessary, don't waste time. */
3954 while (!giveup_match_end
)
3956 int total_read
, nread
, bufpos
, curpos
, trial
;
3958 /* At what file position are we now scanning? */
3959 curpos
= XINT (end
) - (ZV_BYTE
- same_at_end
);
3960 /* If the entire file matches the buffer tail, stop the scan. */
3963 /* How much can we scan in the next step? */
3964 trial
= min (curpos
, sizeof buffer
);
3965 if (lseek (fd
, curpos
- trial
, 0) < 0)
3966 report_file_error ("Setting file position",
3967 Fcons (orig_filename
, Qnil
));
3969 total_read
= nread
= 0;
3970 while (total_read
< trial
)
3972 nread
= emacs_read (fd
, buffer
+ total_read
, trial
- total_read
);
3974 error ("IO error reading %s: %s",
3975 SDATA (orig_filename
), emacs_strerror (errno
));
3976 else if (nread
== 0)
3978 total_read
+= nread
;
3981 /* Scan this bufferful from the end, comparing with
3982 the Emacs buffer. */
3983 bufpos
= total_read
;
3985 /* Compare with same_at_start to avoid counting some buffer text
3986 as matching both at the file's beginning and at the end. */
3987 while (bufpos
> 0 && same_at_end
> same_at_start
3988 && FETCH_BYTE (same_at_end
- 1) == buffer
[bufpos
- 1])
3989 same_at_end
--, bufpos
--;
3991 /* If we found a discrepancy, stop the scan.
3992 Otherwise loop around and scan the preceding bufferful. */
3995 /* If this discrepancy is because of code conversion,
3996 we cannot use this method; giveup and try the other. */
3997 if (same_at_end
> same_at_start
3998 && FETCH_BYTE (same_at_end
- 1) >= 0200
3999 && ! NILP (current_buffer
->enable_multibyte_characters
)
4000 && (CODING_MAY_REQUIRE_DECODING (&coding
)))
4001 giveup_match_end
= 1;
4010 if (! giveup_match_end
)
4014 /* We win! We can handle REPLACE the optimized way. */
4016 /* Extend the start of non-matching text area to multibyte
4017 character boundary. */
4018 if (! NILP (current_buffer
->enable_multibyte_characters
))
4019 while (same_at_start
> BEGV_BYTE
4020 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start
)))
4023 /* Extend the end of non-matching text area to multibyte
4024 character boundary. */
4025 if (! NILP (current_buffer
->enable_multibyte_characters
))
4026 while (same_at_end
< ZV_BYTE
4027 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end
)))
4030 /* Don't try to reuse the same piece of text twice. */
4031 overlap
= (same_at_start
- BEGV_BYTE
4032 - (same_at_end
+ st
.st_size
- ZV
));
4034 same_at_end
+= overlap
;
4036 /* Arrange to read only the nonmatching middle part of the file. */
4037 XSETFASTINT (beg
, XINT (beg
) + (same_at_start
- BEGV_BYTE
));
4038 XSETFASTINT (end
, XINT (end
) - (ZV_BYTE
- same_at_end
));
4040 del_range_byte (same_at_start
, same_at_end
, 0);
4041 /* Insert from the file at the proper position. */
4042 temp
= BYTE_TO_CHAR (same_at_start
);
4043 SET_PT_BOTH (temp
, same_at_start
);
4045 /* If display currently starts at beginning of line,
4046 keep it that way. */
4047 if (XBUFFER (XWINDOW (selected_window
)->buffer
) == current_buffer
)
4048 XWINDOW (selected_window
)->start_at_line_beg
= Fbolp ();
4050 replace_handled
= 1;
4054 /* If requested, replace the accessible part of the buffer
4055 with the file contents. Avoid replacing text at the
4056 beginning or end of the buffer that matches the file contents;
4057 that preserves markers pointing to the unchanged parts.
4059 Here we implement this feature for the case where code conversion
4060 is needed, in a simple way that needs a lot of memory.
4061 The preceding if-statement handles the case of no conversion
4062 in a more optimized way. */
4063 if (!NILP (replace
) && ! replace_handled
&& BEGV
< ZV
)
4065 int same_at_start
= BEGV_BYTE
;
4066 int same_at_end
= ZV_BYTE
;
4069 /* Make sure that the gap is large enough. */
4070 int bufsize
= 2 * st
.st_size
;
4071 unsigned char *conversion_buffer
= (unsigned char *) xmalloc (bufsize
);
4074 /* First read the whole file, performing code conversion into
4075 CONVERSION_BUFFER. */
4077 if (lseek (fd
, XINT (beg
), 0) < 0)
4079 xfree (conversion_buffer
);
4080 report_file_error ("Setting file position",
4081 Fcons (orig_filename
, Qnil
));
4084 total
= st
.st_size
; /* Total bytes in the file. */
4085 how_much
= 0; /* Bytes read from file so far. */
4086 inserted
= 0; /* Bytes put into CONVERSION_BUFFER so far. */
4087 unprocessed
= 0; /* Bytes not processed in previous loop. */
4089 while (how_much
< total
)
4091 /* try is reserved in some compilers (Microsoft C) */
4092 int trytry
= min (total
- how_much
, READ_BUF_SIZE
- unprocessed
);
4093 unsigned char *destination
= read_buf
+ unprocessed
;
4096 /* Allow quitting out of the actual I/O. */
4099 this = emacs_read (fd
, destination
, trytry
);
4102 if (this < 0 || this + unprocessed
== 0)
4110 if (CODING_MAY_REQUIRE_DECODING (&coding
))
4112 int require
, result
;
4114 this += unprocessed
;
4116 /* If we are using more space than estimated,
4117 make CONVERSION_BUFFER bigger. */
4118 require
= decoding_buffer_size (&coding
, this);
4119 if (inserted
+ require
+ 2 * (total
- how_much
) > bufsize
)
4121 bufsize
= inserted
+ require
+ 2 * (total
- how_much
);
4122 conversion_buffer
= (unsigned char *) xrealloc (conversion_buffer
, bufsize
);
4125 /* Convert this batch with results in CONVERSION_BUFFER. */
4126 if (how_much
>= total
) /* This is the last block. */
4127 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
4128 if (coding
.composing
!= COMPOSITION_DISABLED
)
4129 coding_allocate_composition_data (&coding
, BEGV
);
4130 result
= decode_coding (&coding
, read_buf
,
4131 conversion_buffer
+ inserted
,
4132 this, bufsize
- inserted
);
4134 /* Save for next iteration whatever we didn't convert. */
4135 unprocessed
= this - coding
.consumed
;
4136 bcopy (read_buf
+ coding
.consumed
, read_buf
, unprocessed
);
4137 if (!NILP (current_buffer
->enable_multibyte_characters
))
4138 this = coding
.produced
;
4140 this = str_as_unibyte (conversion_buffer
+ inserted
,
4147 /* At this point, INSERTED is how many characters (i.e. bytes)
4148 are present in CONVERSION_BUFFER.
4149 HOW_MUCH should equal TOTAL,
4150 or should be <= 0 if we couldn't read the file. */
4154 xfree (conversion_buffer
);
4157 error ("IO error reading %s: %s",
4158 SDATA (orig_filename
), emacs_strerror (errno
));
4159 else if (how_much
== -2)
4160 error ("maximum buffer size exceeded");
4163 /* Compare the beginning of the converted file
4164 with the buffer text. */
4167 while (bufpos
< inserted
&& same_at_start
< same_at_end
4168 && FETCH_BYTE (same_at_start
) == conversion_buffer
[bufpos
])
4169 same_at_start
++, bufpos
++;
4171 /* If the file matches the buffer completely,
4172 there's no need to replace anything. */
4174 if (bufpos
== inserted
)
4176 xfree (conversion_buffer
);
4179 /* Truncate the buffer to the size of the file. */
4180 del_range_byte (same_at_start
, same_at_end
, 0);
4185 /* Extend the start of non-matching text area to multibyte
4186 character boundary. */
4187 if (! NILP (current_buffer
->enable_multibyte_characters
))
4188 while (same_at_start
> BEGV_BYTE
4189 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start
)))
4192 /* Scan this bufferful from the end, comparing with
4193 the Emacs buffer. */
4196 /* Compare with same_at_start to avoid counting some buffer text
4197 as matching both at the file's beginning and at the end. */
4198 while (bufpos
> 0 && same_at_end
> same_at_start
4199 && FETCH_BYTE (same_at_end
- 1) == conversion_buffer
[bufpos
- 1])
4200 same_at_end
--, bufpos
--;
4202 /* Extend the end of non-matching text area to multibyte
4203 character boundary. */
4204 if (! NILP (current_buffer
->enable_multibyte_characters
))
4205 while (same_at_end
< ZV_BYTE
4206 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end
)))
4209 /* Don't try to reuse the same piece of text twice. */
4210 overlap
= same_at_start
- BEGV_BYTE
- (same_at_end
+ inserted
- ZV_BYTE
);
4212 same_at_end
+= overlap
;
4214 /* If display currently starts at beginning of line,
4215 keep it that way. */
4216 if (XBUFFER (XWINDOW (selected_window
)->buffer
) == current_buffer
)
4217 XWINDOW (selected_window
)->start_at_line_beg
= Fbolp ();
4219 /* Replace the chars that we need to replace,
4220 and update INSERTED to equal the number of bytes
4221 we are taking from the file. */
4222 inserted
-= (Z_BYTE
- same_at_end
) + (same_at_start
- BEG_BYTE
);
4224 if (same_at_end
!= same_at_start
)
4226 del_range_byte (same_at_start
, same_at_end
, 0);
4228 same_at_start
= GPT_BYTE
;
4232 temp
= BYTE_TO_CHAR (same_at_start
);
4234 /* Insert from the file at the proper position. */
4235 SET_PT_BOTH (temp
, same_at_start
);
4236 insert_1 (conversion_buffer
+ same_at_start
- BEG_BYTE
, inserted
,
4238 if (coding
.cmp_data
&& coding
.cmp_data
->used
)
4239 coding_restore_composition (&coding
, Fcurrent_buffer ());
4240 coding_free_composition_data (&coding
);
4242 /* Set `inserted' to the number of inserted characters. */
4243 inserted
= PT
- temp
;
4245 xfree (conversion_buffer
);
4254 register Lisp_Object temp
;
4256 total
= XINT (end
) - XINT (beg
);
4258 /* Make sure point-max won't overflow after this insertion. */
4259 XSETINT (temp
, total
);
4260 if (total
!= XINT (temp
))
4261 error ("Maximum buffer size exceeded");
4264 /* For a special file, all we can do is guess. */
4265 total
= READ_BUF_SIZE
;
4267 if (NILP (visit
) && total
> 0)
4268 prepare_to_modify_buffer (PT
, PT
, NULL
);
4271 if (GAP_SIZE
< total
)
4272 make_gap (total
- GAP_SIZE
);
4274 if (XINT (beg
) != 0 || !NILP (replace
))
4276 if (lseek (fd
, XINT (beg
), 0) < 0)
4277 report_file_error ("Setting file position",
4278 Fcons (orig_filename
, Qnil
));
4281 /* In the following loop, HOW_MUCH contains the total bytes read so
4282 far for a regular file, and not changed for a special file. But,
4283 before exiting the loop, it is set to a negative value if I/O
4287 /* Total bytes inserted. */
4290 /* Here, we don't do code conversion in the loop. It is done by
4291 code_convert_region after all data are read into the buffer. */
4293 int gap_size
= GAP_SIZE
;
4295 while (how_much
< total
)
4297 /* try is reserved in some compilers (Microsoft C) */
4298 int trytry
= min (total
- how_much
, READ_BUF_SIZE
);
4305 /* Maybe make more room. */
4306 if (gap_size
< trytry
)
4308 make_gap (total
- gap_size
);
4309 gap_size
= GAP_SIZE
;
4312 /* Read from the file, capturing `quit'. When an
4313 error occurs, end the loop, and arrange for a quit
4314 to be signaled after decoding the text we read. */
4315 non_regular_fd
= fd
;
4316 non_regular_inserted
= inserted
;
4317 non_regular_nbytes
= trytry
;
4318 val
= internal_condition_case_1 (read_non_regular
, Qnil
, Qerror
,
4319 read_non_regular_quit
);
4330 /* Allow quitting out of the actual I/O. We don't make text
4331 part of the buffer until all the reading is done, so a C-g
4332 here doesn't do any harm. */
4335 this = emacs_read (fd
, BEG_ADDR
+ PT_BYTE
- BEG_BYTE
+ inserted
, trytry
);
4347 /* For a regular file, where TOTAL is the real size,
4348 count HOW_MUCH to compare with it.
4349 For a special file, where TOTAL is just a buffer size,
4350 so don't bother counting in HOW_MUCH.
4351 (INSERTED is where we count the number of characters inserted.) */
4358 /* Make the text read part of the buffer. */
4359 GAP_SIZE
-= inserted
;
4361 GPT_BYTE
+= inserted
;
4363 ZV_BYTE
+= inserted
;
4368 /* Put an anchor to ensure multi-byte form ends at gap. */
4373 /* Discard the unwind protect for closing the file. */
4377 error ("IO error reading %s: %s",
4378 SDATA (orig_filename
), emacs_strerror (errno
));
4382 if (! coding_system_decided
)
4384 /* The coding system is not yet decided. Decide it by an
4385 optimized method for handling `coding:' tag.
4387 Note that we can get here only if the buffer was empty
4388 before the insertion. */
4392 if (!NILP (Vcoding_system_for_read
))
4393 val
= Vcoding_system_for_read
;
4396 /* Since we are sure that the current buffer was empty
4397 before the insertion, we can toggle
4398 enable-multibyte-characters directly here without taking
4399 care of marker adjustment and byte combining problem. By
4400 this way, we can run Lisp program safely before decoding
4401 the inserted text. */
4402 Lisp_Object unwind_data
;
4403 int count
= SPECPDL_INDEX ();
4405 unwind_data
= Fcons (current_buffer
->enable_multibyte_characters
,
4406 Fcons (current_buffer
->undo_list
,
4407 Fcurrent_buffer ()));
4408 current_buffer
->enable_multibyte_characters
= Qnil
;
4409 current_buffer
->undo_list
= Qt
;
4410 record_unwind_protect (decide_coding_unwind
, unwind_data
);
4412 if (inserted
> 0 && ! NILP (Vset_auto_coding_function
))
4414 val
= call2 (Vset_auto_coding_function
,
4415 filename
, make_number (inserted
));
4420 /* If the coding system is not yet decided, check
4421 file-coding-system-alist. */
4422 Lisp_Object args
[6], coding_systems
;
4424 args
[0] = Qinsert_file_contents
, args
[1] = orig_filename
;
4425 args
[2] = visit
, args
[3] = beg
, args
[4] = end
, args
[5] = Qnil
;
4426 coding_systems
= Ffind_operation_coding_system (6, args
);
4427 if (CONSP (coding_systems
))
4428 val
= XCAR (coding_systems
);
4431 unbind_to (count
, Qnil
);
4432 inserted
= Z_BYTE
- BEG_BYTE
;
4435 /* The following kludgy code is to avoid some compiler bug.
4437 setup_coding_system (val, &coding);
4440 struct coding_system temp_coding
;
4441 setup_coding_system (val
, &temp_coding
);
4442 bcopy (&temp_coding
, &coding
, sizeof coding
);
4444 /* Ensure we set Vlast_coding_system_used. */
4445 set_coding_system
= 1;
4447 if (NILP (current_buffer
->enable_multibyte_characters
)
4449 /* We must suppress all character code conversion except for
4450 end-of-line conversion. */
4451 setup_raw_text_coding_system (&coding
);
4452 coding
.src_multibyte
= 0;
4453 coding
.dst_multibyte
4454 = !NILP (current_buffer
->enable_multibyte_characters
);
4458 /* Can't do this if part of the buffer might be preserved. */
4460 && (coding
.type
== coding_type_no_conversion
4461 || coding
.type
== coding_type_raw_text
))
4463 /* Visiting a file with these coding system makes the buffer
4465 current_buffer
->enable_multibyte_characters
= Qnil
;
4466 coding
.dst_multibyte
= 0;
4469 if (inserted
> 0 || coding
.type
== coding_type_ccl
)
4471 if (CODING_MAY_REQUIRE_DECODING (&coding
))
4473 code_convert_region (PT
, PT_BYTE
, PT
+ inserted
, PT_BYTE
+ inserted
,
4475 inserted
= coding
.produced_char
;
4478 adjust_after_insert (PT
, PT_BYTE
, PT
+ inserted
, PT_BYTE
+ inserted
,
4483 /* Use the conversion type to determine buffer-file-type
4484 (find-buffer-file-type is now used to help determine the
4486 if ((coding
.eol_type
== CODING_EOL_UNDECIDED
4487 || coding
.eol_type
== CODING_EOL_LF
)
4488 && ! CODING_REQUIRE_DECODING (&coding
))
4489 current_buffer
->buffer_file_type
= Qt
;
4491 current_buffer
->buffer_file_type
= Qnil
;
4498 if (!EQ (current_buffer
->undo_list
, Qt
))
4499 current_buffer
->undo_list
= Qnil
;
4501 stat (SDATA (filename
), &st
);
4506 current_buffer
->modtime
= st
.st_mtime
;
4507 current_buffer
->filename
= orig_filename
;
4510 SAVE_MODIFF
= MODIFF
;
4511 current_buffer
->auto_save_modified
= MODIFF
;
4512 XSETFASTINT (current_buffer
->save_length
, Z
- BEG
);
4513 #ifdef CLASH_DETECTION
4516 if (!NILP (current_buffer
->file_truename
))
4517 unlock_file (current_buffer
->file_truename
);
4518 unlock_file (filename
);
4520 #endif /* CLASH_DETECTION */
4522 Fsignal (Qfile_error
,
4523 Fcons (build_string ("not a regular file"),
4524 Fcons (orig_filename
, Qnil
)));
4527 /* Decode file format */
4530 int empty_undo_list_p
= 0;
4532 /* If we're anyway going to discard undo information, don't
4533 record it in the first place. The buffer's undo list at this
4534 point is either nil or t when visiting a file. */
4537 empty_undo_list_p
= NILP (current_buffer
->undo_list
);
4538 current_buffer
->undo_list
= Qt
;
4541 insval
= call3 (Qformat_decode
,
4542 Qnil
, make_number (inserted
), visit
);
4543 CHECK_NUMBER (insval
);
4544 inserted
= XFASTINT (insval
);
4547 current_buffer
->undo_list
= empty_undo_list_p
? Qnil
: Qt
;
4550 if (set_coding_system
)
4551 Vlast_coding_system_used
= coding
.symbol
;
4553 /* Call after-change hooks for the inserted text, aside from the case
4554 of normal visiting (not with REPLACE), which is done in a new buffer
4555 "before" the buffer is changed. */
4556 if (inserted
> 0 && total
> 0
4557 && (NILP (visit
) || !NILP (replace
)))
4559 signal_after_change (PT
, 0, inserted
);
4560 update_compositions (PT
, PT
, CHECK_BORDER
);
4563 p
= Vafter_insert_file_functions
;
4566 insval
= call1 (XCAR (p
), make_number (inserted
));
4569 CHECK_NUMBER (insval
);
4570 inserted
= XFASTINT (insval
);
4577 && current_buffer
->modtime
== -1)
4579 /* If visiting nonexistent file, return nil. */
4580 report_file_error ("Opening input file", Fcons (orig_filename
, Qnil
));
4584 Fsignal (Qquit
, Qnil
);
4586 /* ??? Retval needs to be dealt with in all cases consistently. */
4588 val
= Fcons (orig_filename
,
4589 Fcons (make_number (inserted
),
4592 RETURN_UNGCPRO (unbind_to (count
, val
));
4595 static Lisp_Object build_annotations
P_ ((Lisp_Object
, Lisp_Object
));
4596 static Lisp_Object build_annotations_2
P_ ((Lisp_Object
, Lisp_Object
,
4597 Lisp_Object
, Lisp_Object
));
4599 /* If build_annotations switched buffers, switch back to BUF.
4600 Kill the temporary buffer that was selected in the meantime.
4602 Since this kill only the last temporary buffer, some buffers remain
4603 not killed if build_annotations switched buffers more than once.
4607 build_annotations_unwind (buf
)
4612 if (XBUFFER (buf
) == current_buffer
)
4614 tembuf
= Fcurrent_buffer ();
4616 Fkill_buffer (tembuf
);
4620 /* Decide the coding-system to encode the data with. */
4623 choose_write_coding_system (start
, end
, filename
,
4624 append
, visit
, lockname
, coding
)
4625 Lisp_Object start
, end
, filename
, append
, visit
, lockname
;
4626 struct coding_system
*coding
;
4632 else if (!NILP (Vcoding_system_for_write
))
4633 val
= Vcoding_system_for_write
;
4636 /* If the variable `buffer-file-coding-system' is set locally,
4637 it means that the file was read with some kind of code
4638 conversion or the variable is explicitly set by users. We
4639 had better write it out with the same coding system even if
4640 `enable-multibyte-characters' is nil.
4642 If it is not set locally, we anyway have to convert EOL
4643 format if the default value of `buffer-file-coding-system'
4644 tells that it is not Unix-like (LF only) format. */
4645 int using_default_coding
= 0;
4646 int force_raw_text
= 0;
4648 val
= current_buffer
->buffer_file_coding_system
;
4650 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
4653 if (NILP (current_buffer
->enable_multibyte_characters
))
4659 /* Check file-coding-system-alist. */
4660 Lisp_Object args
[7], coding_systems
;
4662 args
[0] = Qwrite_region
; args
[1] = start
; args
[2] = end
;
4663 args
[3] = filename
; args
[4] = append
; args
[5] = visit
;
4665 coding_systems
= Ffind_operation_coding_system (7, args
);
4666 if (CONSP (coding_systems
) && !NILP (XCDR (coding_systems
)))
4667 val
= XCDR (coding_systems
);
4671 && !NILP (current_buffer
->buffer_file_coding_system
))
4673 /* If we still have not decided a coding system, use the
4674 default value of buffer-file-coding-system. */
4675 val
= current_buffer
->buffer_file_coding_system
;
4676 using_default_coding
= 1;
4680 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
4681 /* Confirm that VAL can surely encode the current region. */
4682 val
= call5 (Vselect_safe_coding_system_function
,
4683 start
, end
, val
, Qnil
, filename
);
4685 setup_coding_system (Fcheck_coding_system (val
), coding
);
4686 if (coding
->eol_type
== CODING_EOL_UNDECIDED
4687 && !using_default_coding
)
4689 if (! EQ (default_buffer_file_coding
.symbol
,
4690 buffer_defaults
.buffer_file_coding_system
))
4691 setup_coding_system (buffer_defaults
.buffer_file_coding_system
,
4692 &default_buffer_file_coding
);
4693 if (default_buffer_file_coding
.eol_type
!= CODING_EOL_UNDECIDED
)
4695 Lisp_Object subsidiaries
;
4697 coding
->eol_type
= default_buffer_file_coding
.eol_type
;
4698 subsidiaries
= Fget (coding
->symbol
, Qeol_type
);
4699 if (VECTORP (subsidiaries
)
4700 && XVECTOR (subsidiaries
)->size
== 3)
4702 = XVECTOR (subsidiaries
)->contents
[coding
->eol_type
];
4707 setup_raw_text_coding_system (coding
);
4708 goto done_setup_coding
;
4711 setup_coding_system (Fcheck_coding_system (val
), coding
);
4714 if (!STRINGP (start
) && !NILP (current_buffer
->selective_display
))
4715 coding
->mode
|= CODING_MODE_SELECTIVE_DISPLAY
;
4718 DEFUN ("write-region", Fwrite_region
, Swrite_region
, 3, 7,
4719 "r\nFWrite region to file: \ni\ni\ni\np",
4720 doc
: /* Write current region into specified file.
4721 When called from a program, requires three arguments:
4722 START, END and FILENAME. START and END are normally buffer positions
4723 specifying the part of the buffer to write.
4724 If START is nil, that means to use the entire buffer contents.
4725 If START is a string, then output that string to the file
4726 instead of any buffer contents; END is ignored.
4728 Optional fourth argument APPEND if non-nil means
4729 append to existing file contents (if any). If it is an integer,
4730 seek to that offset in the file before writing.
4731 Optional fifth argument VISIT if t means
4732 set the last-save-file-modtime of buffer to this file's modtime
4733 and mark buffer not modified.
4734 If VISIT is a string, it is a second file name;
4735 the output goes to FILENAME, but the buffer is marked as visiting VISIT.
4736 VISIT is also the file name to lock and unlock for clash detection.
4737 If VISIT is neither t nor nil nor a string,
4738 that means do not display the \"Wrote file\" message.
4739 The optional sixth arg LOCKNAME, if non-nil, specifies the name to
4740 use for locking and unlocking, overriding FILENAME and VISIT.
4741 The optional seventh arg MUSTBENEW, if non-nil, insists on a check
4742 for an existing file with the same name. If MUSTBENEW is `excl',
4743 that means to get an error if the file already exists; never overwrite.
4744 If MUSTBENEW is neither nil nor `excl', that means ask for
4745 confirmation before overwriting, but do go ahead and overwrite the file
4746 if the user confirms.
4748 This does code conversion according to the value of
4749 `coding-system-for-write', `buffer-file-coding-system', or
4750 `file-coding-system-alist', and sets the variable
4751 `last-coding-system-used' to the coding system actually used. */)
4752 (start
, end
, filename
, append
, visit
, lockname
, mustbenew
)
4753 Lisp_Object start
, end
, filename
, append
, visit
, lockname
, mustbenew
;
4758 const unsigned char *fn
;
4761 int count
= SPECPDL_INDEX ();
4764 unsigned char *fname
= 0; /* If non-0, original filename (must rename) */
4766 Lisp_Object handler
;
4767 Lisp_Object visit_file
;
4768 Lisp_Object annotations
;
4769 Lisp_Object encoded_filename
;
4770 int visiting
= (EQ (visit
, Qt
) || STRINGP (visit
));
4771 int quietly
= !NILP (visit
);
4772 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
4773 struct buffer
*given_buffer
;
4775 int buffer_file_type
= O_BINARY
;
4777 struct coding_system coding
;
4779 if (current_buffer
->base_buffer
&& visiting
)
4780 error ("Cannot do file visiting in an indirect buffer");
4782 if (!NILP (start
) && !STRINGP (start
))
4783 validate_region (&start
, &end
);
4785 GCPRO5 (start
, filename
, visit
, visit_file
, lockname
);
4787 filename
= Fexpand_file_name (filename
, Qnil
);
4789 if (!NILP (mustbenew
) && !EQ (mustbenew
, Qexcl
))
4790 barf_or_query_if_file_exists (filename
, "overwrite", 1, 0, 1);
4792 if (STRINGP (visit
))
4793 visit_file
= Fexpand_file_name (visit
, Qnil
);
4795 visit_file
= filename
;
4797 if (NILP (lockname
))
4798 lockname
= visit_file
;
4802 /* If the file name has special constructs in it,
4803 call the corresponding file handler. */
4804 handler
= Ffind_file_name_handler (filename
, Qwrite_region
);
4805 /* If FILENAME has no handler, see if VISIT has one. */
4806 if (NILP (handler
) && STRINGP (visit
))
4807 handler
= Ffind_file_name_handler (visit
, Qwrite_region
);
4809 if (!NILP (handler
))
4812 val
= call6 (handler
, Qwrite_region
, start
, end
,
4813 filename
, append
, visit
);
4817 SAVE_MODIFF
= MODIFF
;
4818 XSETFASTINT (current_buffer
->save_length
, Z
- BEG
);
4819 current_buffer
->filename
= visit_file
;
4825 /* Special kludge to simplify auto-saving. */
4828 XSETFASTINT (start
, BEG
);
4829 XSETFASTINT (end
, Z
);
4832 record_unwind_protect (build_annotations_unwind
, Fcurrent_buffer ());
4833 count1
= SPECPDL_INDEX ();
4835 given_buffer
= current_buffer
;
4837 if (!STRINGP (start
))
4839 annotations
= build_annotations (start
, end
);
4841 if (current_buffer
!= given_buffer
)
4843 XSETFASTINT (start
, BEGV
);
4844 XSETFASTINT (end
, ZV
);
4850 GCPRO5 (start
, filename
, annotations
, visit_file
, lockname
);
4852 /* Decide the coding-system to encode the data with.
4853 We used to make this choice before calling build_annotations, but that
4854 leads to problems when a write-annotate-function takes care of
4855 unsavable chars (as was the case with X-Symbol). */
4856 choose_write_coding_system (start
, end
, filename
,
4857 append
, visit
, lockname
, &coding
);
4858 Vlast_coding_system_used
= coding
.symbol
;
4860 given_buffer
= current_buffer
;
4861 if (! STRINGP (start
))
4863 annotations
= build_annotations_2 (start
, end
,
4864 coding
.pre_write_conversion
, annotations
);
4865 if (current_buffer
!= given_buffer
)
4867 XSETFASTINT (start
, BEGV
);
4868 XSETFASTINT (end
, ZV
);
4872 #ifdef CLASH_DETECTION
4875 #if 0 /* This causes trouble for GNUS. */
4876 /* If we've locked this file for some other buffer,
4877 query before proceeding. */
4878 if (!visiting
&& EQ (Ffile_locked_p (lockname
), Qt
))
4879 call2 (intern ("ask-user-about-lock"), filename
, Vuser_login_name
);
4882 lock_file (lockname
);
4884 #endif /* CLASH_DETECTION */
4886 encoded_filename
= ENCODE_FILE (filename
);
4888 fn
= SDATA (encoded_filename
);
4892 desc
= emacs_open (fn
, O_WRONLY
| buffer_file_type
, 0);
4893 #else /* not DOS_NT */
4894 desc
= emacs_open (fn
, O_WRONLY
, 0);
4895 #endif /* not DOS_NT */
4897 if (desc
< 0 && (NILP (append
) || errno
== ENOENT
))
4899 if (auto_saving
) /* Overwrite any previous version of autosave file */
4901 vms_truncate (fn
); /* if fn exists, truncate to zero length */
4902 desc
= emacs_open (fn
, O_RDWR
, 0);
4904 desc
= creat_copy_attrs (STRINGP (current_buffer
->filename
)
4905 ? SDATA (current_buffer
->filename
) : 0,
4908 else /* Write to temporary name and rename if no errors */
4910 Lisp_Object temp_name
;
4911 temp_name
= Ffile_name_directory (filename
);
4913 if (!NILP (temp_name
))
4915 temp_name
= Fmake_temp_name (concat2 (temp_name
,
4916 build_string ("$$SAVE$$")));
4917 fname
= SDATA (filename
);
4918 fn
= SDATA (temp_name
);
4919 desc
= creat_copy_attrs (fname
, fn
);
4922 /* If we can't open the temporary file, try creating a new
4923 version of the original file. VMS "creat" creates a
4924 new version rather than truncating an existing file. */
4927 desc
= creat (fn
, 0666);
4928 #if 0 /* This can clobber an existing file and fail to replace it,
4929 if the user runs out of space. */
4932 /* We can't make a new version;
4933 try to truncate and rewrite existing version if any. */
4935 desc
= emacs_open (fn
, O_RDWR
, 0);
4941 desc
= creat (fn
, 0666);
4945 desc
= emacs_open (fn
,
4946 O_WRONLY
| O_CREAT
| buffer_file_type
4947 | (EQ (mustbenew
, Qexcl
) ? O_EXCL
: O_TRUNC
),
4948 S_IREAD
| S_IWRITE
);
4949 #else /* not DOS_NT */
4950 desc
= emacs_open (fn
, O_WRONLY
| O_TRUNC
| O_CREAT
4951 | (EQ (mustbenew
, Qexcl
) ? O_EXCL
: 0),
4952 auto_saving
? auto_save_mode_bits
: 0666);
4953 #endif /* not DOS_NT */
4954 #endif /* not VMS */
4958 #ifdef CLASH_DETECTION
4960 if (!auto_saving
) unlock_file (lockname
);
4962 #endif /* CLASH_DETECTION */
4964 report_file_error ("Opening output file", Fcons (filename
, Qnil
));
4967 record_unwind_protect (close_file_unwind
, make_number (desc
));
4969 if (!NILP (append
) && !NILP (Ffile_regular_p (filename
)))
4973 if (NUMBERP (append
))
4974 ret
= lseek (desc
, XINT (append
), 1);
4976 ret
= lseek (desc
, 0, 2);
4979 #ifdef CLASH_DETECTION
4980 if (!auto_saving
) unlock_file (lockname
);
4981 #endif /* CLASH_DETECTION */
4983 report_file_error ("Lseek error", Fcons (filename
, Qnil
));
4991 * Kludge Warning: The VMS C RTL likes to insert carriage returns
4992 * if we do writes that don't end with a carriage return. Furthermore
4993 * it cannot handle writes of more then 16K. The modified
4994 * version of "sys_write" in SYSDEP.C (see comment there) copes with
4995 * this EXCEPT for the last record (iff it doesn't end with a carriage
4996 * return). This implies that if your buffer doesn't end with a carriage
4997 * return, you get one free... tough. However it also means that if
4998 * we make two calls to sys_write (a la the following code) you can
4999 * get one at the gap as well. The easiest way to fix this (honest)
5000 * is to move the gap to the next newline (or the end of the buffer).
5005 if (GPT
> BEG
&& GPT_ADDR
[-1] != '\n')
5006 move_gap (find_next_newline (GPT
, 1));
5008 /* Whether VMS or not, we must move the gap to the next of newline
5009 when we must put designation sequences at beginning of line. */
5010 if (INTEGERP (start
)
5011 && coding
.type
== coding_type_iso2022
5012 && coding
.flags
& CODING_FLAG_ISO_DESIGNATE_AT_BOL
5013 && GPT
> BEG
&& GPT_ADDR
[-1] != '\n')
5015 int opoint
= PT
, opoint_byte
= PT_BYTE
;
5016 scan_newline (PT
, PT_BYTE
, ZV
, ZV_BYTE
, 1, 0);
5017 move_gap_both (PT
, PT_BYTE
);
5018 SET_PT_BOTH (opoint
, opoint_byte
);
5025 if (STRINGP (start
))
5027 failure
= 0 > a_write (desc
, start
, 0, SCHARS (start
),
5028 &annotations
, &coding
);
5031 else if (XINT (start
) != XINT (end
))
5033 tem
= CHAR_TO_BYTE (XINT (start
));
5035 if (XINT (start
) < GPT
)
5037 failure
= 0 > a_write (desc
, Qnil
, XINT (start
),
5038 min (GPT
, XINT (end
)) - XINT (start
),
5039 &annotations
, &coding
);
5043 if (XINT (end
) > GPT
&& !failure
)
5045 tem
= max (XINT (start
), GPT
);
5046 failure
= 0 > a_write (desc
, Qnil
, tem
, XINT (end
) - tem
,
5047 &annotations
, &coding
);
5053 /* If file was empty, still need to write the annotations */
5054 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
5055 failure
= 0 > a_write (desc
, Qnil
, XINT (end
), 0, &annotations
, &coding
);
5059 if (CODING_REQUIRE_FLUSHING (&coding
)
5060 && !(coding
.mode
& CODING_MODE_LAST_BLOCK
)
5063 /* We have to flush out a data. */
5064 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
5065 failure
= 0 > e_write (desc
, Qnil
, 0, 0, &coding
);
5072 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun).
5073 Disk full in NFS may be reported here. */
5074 /* mib says that closing the file will try to write as fast as NFS can do
5075 it, and that means the fsync here is not crucial for autosave files. */
5076 if (!auto_saving
&& fsync (desc
) < 0)
5078 /* If fsync fails with EINTR, don't treat that as serious. */
5080 failure
= 1, save_errno
= errno
;
5084 /* Spurious "file has changed on disk" warnings have been
5085 observed on Suns as well.
5086 It seems that `close' can change the modtime, under nfs.
5088 (This has supposedly been fixed in Sunos 4,
5089 but who knows about all the other machines with NFS?) */
5092 /* On VMS and APOLLO, must do the stat after the close
5093 since closing changes the modtime. */
5096 /* Recall that #if defined does not work on VMS. */
5103 /* NFS can report a write failure now. */
5104 if (emacs_close (desc
) < 0)
5105 failure
= 1, save_errno
= errno
;
5108 /* If we wrote to a temporary name and had no errors, rename to real name. */
5112 failure
= (rename (fn
, fname
) != 0), save_errno
= errno
;
5120 /* Discard the unwind protect for close_file_unwind. */
5121 specpdl_ptr
= specpdl
+ count1
;
5122 /* Restore the original current buffer. */
5123 visit_file
= unbind_to (count
, visit_file
);
5125 #ifdef CLASH_DETECTION
5127 unlock_file (lockname
);
5128 #endif /* CLASH_DETECTION */
5130 /* Do this before reporting IO error
5131 to avoid a "file has changed on disk" warning on
5132 next attempt to save. */
5134 current_buffer
->modtime
= st
.st_mtime
;
5137 error ("IO error writing %s: %s", SDATA (filename
),
5138 emacs_strerror (save_errno
));
5142 SAVE_MODIFF
= MODIFF
;
5143 XSETFASTINT (current_buffer
->save_length
, Z
- BEG
);
5144 current_buffer
->filename
= visit_file
;
5145 update_mode_lines
++;
5151 message_with_string ("Wrote %s", visit_file
, 1);
5156 Lisp_Object
merge ();
5158 DEFUN ("car-less-than-car", Fcar_less_than_car
, Scar_less_than_car
, 2, 2, 0,
5159 doc
: /* Return t if (car A) is numerically less than (car B). */)
5163 return Flss (Fcar (a
), Fcar (b
));
5166 /* Build the complete list of annotations appropriate for writing out
5167 the text between START and END, by calling all the functions in
5168 write-region-annotate-functions and merging the lists they return.
5169 If one of these functions switches to a different buffer, we assume
5170 that buffer contains altered text. Therefore, the caller must
5171 make sure to restore the current buffer in all cases,
5172 as save-excursion would do. */
5175 build_annotations (start
, end
)
5176 Lisp_Object start
, end
;
5178 Lisp_Object annotations
;
5180 struct gcpro gcpro1
, gcpro2
;
5181 Lisp_Object original_buffer
;
5184 XSETBUFFER (original_buffer
, current_buffer
);
5187 p
= Vwrite_region_annotate_functions
;
5188 GCPRO2 (annotations
, p
);
5191 struct buffer
*given_buffer
= current_buffer
;
5192 Vwrite_region_annotations_so_far
= annotations
;
5193 res
= call2 (XCAR (p
), start
, end
);
5194 /* If the function makes a different buffer current,
5195 assume that means this buffer contains altered text to be output.
5196 Reset START and END from the buffer bounds
5197 and discard all previous annotations because they should have
5198 been dealt with by this function. */
5199 if (current_buffer
!= given_buffer
)
5201 XSETFASTINT (start
, BEGV
);
5202 XSETFASTINT (end
, ZV
);
5205 Flength (res
); /* Check basic validity of return value */
5206 annotations
= merge (annotations
, res
, Qcar_less_than_car
);
5210 /* Now do the same for annotation functions implied by the file-format */
5211 if (auto_saving
&& (!EQ (Vauto_save_file_format
, Qt
)))
5212 p
= Vauto_save_file_format
;
5214 p
= current_buffer
->file_format
;
5215 for (i
= 0; CONSP (p
); p
= XCDR (p
), ++i
)
5217 struct buffer
*given_buffer
= current_buffer
;
5219 Vwrite_region_annotations_so_far
= annotations
;
5221 /* Value is either a list of annotations or nil if the function
5222 has written annotations to a temporary buffer, which is now
5224 res
= call5 (Qformat_annotate_function
, XCAR (p
), start
, end
,
5225 original_buffer
, make_number (i
));
5226 if (current_buffer
!= given_buffer
)
5228 XSETFASTINT (start
, BEGV
);
5229 XSETFASTINT (end
, ZV
);
5234 annotations
= merge (annotations
, res
, Qcar_less_than_car
);
5242 build_annotations_2 (start
, end
, pre_write_conversion
, annotations
)
5243 Lisp_Object start
, end
, pre_write_conversion
, annotations
;
5245 struct gcpro gcpro1
;
5248 GCPRO1 (annotations
);
5249 /* At last, do the same for the function PRE_WRITE_CONVERSION
5250 implied by the current coding-system. */
5251 if (!NILP (pre_write_conversion
))
5253 struct buffer
*given_buffer
= current_buffer
;
5254 Vwrite_region_annotations_so_far
= annotations
;
5255 res
= call2 (pre_write_conversion
, start
, end
);
5257 annotations
= (current_buffer
!= given_buffer
5259 : merge (annotations
, res
, Qcar_less_than_car
));
5266 /* Write to descriptor DESC the NCHARS chars starting at POS of STRING.
5267 If STRING is nil, POS is the character position in the current buffer.
5268 Intersperse with them the annotations from *ANNOT
5269 which fall within the range of POS to POS + NCHARS,
5270 each at its appropriate position.
5272 We modify *ANNOT by discarding elements as we use them up.
5274 The return value is negative in case of system call failure. */
5277 a_write (desc
, string
, pos
, nchars
, annot
, coding
)
5280 register int nchars
;
5283 struct coding_system
*coding
;
5287 int lastpos
= pos
+ nchars
;
5289 while (NILP (*annot
) || CONSP (*annot
))
5291 tem
= Fcar_safe (Fcar (*annot
));
5294 nextpos
= XFASTINT (tem
);
5296 /* If there are no more annotations in this range,
5297 output the rest of the range all at once. */
5298 if (! (nextpos
>= pos
&& nextpos
<= lastpos
))
5299 return e_write (desc
, string
, pos
, lastpos
, coding
);
5301 /* Output buffer text up to the next annotation's position. */
5304 if (0 > e_write (desc
, string
, pos
, nextpos
, coding
))
5308 /* Output the annotation. */
5309 tem
= Fcdr (Fcar (*annot
));
5312 if (0 > e_write (desc
, tem
, 0, SCHARS (tem
), coding
))
5315 *annot
= Fcdr (*annot
);
5320 #ifndef WRITE_BUF_SIZE
5321 #define WRITE_BUF_SIZE (16 * 1024)
5324 /* Write text in the range START and END into descriptor DESC,
5325 encoding them with coding system CODING. If STRING is nil, START
5326 and END are character positions of the current buffer, else they
5327 are indexes to the string STRING. */
5330 e_write (desc
, string
, start
, end
, coding
)
5334 struct coding_system
*coding
;
5336 register char *addr
;
5337 register int nbytes
;
5338 char buf
[WRITE_BUF_SIZE
];
5342 coding
->composing
= COMPOSITION_DISABLED
;
5343 if (coding
->composing
!= COMPOSITION_DISABLED
)
5344 coding_save_composition (coding
, start
, end
, string
);
5346 if (STRINGP (string
))
5348 addr
= SDATA (string
);
5349 nbytes
= SBYTES (string
);
5350 coding
->src_multibyte
= STRING_MULTIBYTE (string
);
5352 else if (start
< end
)
5354 /* It is assured that the gap is not in the range START and END-1. */
5355 addr
= CHAR_POS_ADDR (start
);
5356 nbytes
= CHAR_TO_BYTE (end
) - CHAR_TO_BYTE (start
);
5357 coding
->src_multibyte
5358 = !NILP (current_buffer
->enable_multibyte_characters
);
5364 coding
->src_multibyte
= 1;
5367 /* We used to have a code for handling selective display here. But,
5368 now it is handled within encode_coding. */
5373 result
= encode_coding (coding
, addr
, buf
, nbytes
, WRITE_BUF_SIZE
);
5374 if (coding
->produced
> 0)
5376 coding
->produced
-= emacs_write (desc
, buf
, coding
->produced
);
5377 if (coding
->produced
)
5383 nbytes
-= coding
->consumed
;
5384 addr
+= coding
->consumed
;
5385 if (result
== CODING_FINISH_INSUFFICIENT_SRC
5388 /* The source text ends by an incomplete multibyte form.
5389 There's no way other than write it out as is. */
5390 nbytes
-= emacs_write (desc
, addr
, nbytes
);
5399 start
+= coding
->consumed_char
;
5400 if (coding
->cmp_data
)
5401 coding_adjust_composition_offset (coding
, start
);
5404 if (coding
->cmp_data
)
5405 coding_free_composition_data (coding
);
5410 DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime
,
5411 Sverify_visited_file_modtime
, 1, 1, 0,
5412 doc
: /* Return t if last mod time of BUF's visited file matches what BUF records.
5413 This means that the file has not been changed since it was visited or saved. */)
5419 Lisp_Object handler
;
5420 Lisp_Object filename
;
5425 if (!STRINGP (b
->filename
)) return Qt
;
5426 if (b
->modtime
== 0) return Qt
;
5428 /* If the file name has special constructs in it,
5429 call the corresponding file handler. */
5430 handler
= Ffind_file_name_handler (b
->filename
,
5431 Qverify_visited_file_modtime
);
5432 if (!NILP (handler
))
5433 return call2 (handler
, Qverify_visited_file_modtime
, buf
);
5435 filename
= ENCODE_FILE (b
->filename
);
5437 if (stat (SDATA (filename
), &st
) < 0)
5439 /* If the file doesn't exist now and didn't exist before,
5440 we say that it isn't modified, provided the error is a tame one. */
5441 if (errno
== ENOENT
|| errno
== EACCES
|| errno
== ENOTDIR
)
5446 if (st
.st_mtime
== b
->modtime
5447 /* If both are positive, accept them if they are off by one second. */
5448 || (st
.st_mtime
> 0 && b
->modtime
> 0
5449 && (st
.st_mtime
== b
->modtime
+ 1
5450 || st
.st_mtime
== b
->modtime
- 1)))
5455 DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime
,
5456 Sclear_visited_file_modtime
, 0, 0, 0,
5457 doc
: /* Clear out records of last mod time of visited file.
5458 Next attempt to save will certainly not complain of a discrepancy. */)
5461 current_buffer
->modtime
= 0;
5465 DEFUN ("visited-file-modtime", Fvisited_file_modtime
,
5466 Svisited_file_modtime
, 0, 0, 0,
5467 doc
: /* Return the current buffer's recorded visited file modification time.
5468 The value is a list of the form (HIGH . LOW), like the time values
5469 that `file-attributes' returns. */)
5472 return long_to_cons ((unsigned long) current_buffer
->modtime
);
5475 DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime
,
5476 Sset_visited_file_modtime
, 0, 1, 0,
5477 doc
: /* Update buffer's recorded modification time from the visited file's time.
5478 Useful if the buffer was not read from the file normally
5479 or if the file itself has been changed for some known benign reason.
5480 An argument specifies the modification time value to use
5481 \(instead of that of the visited file), in the form of a list
5482 \(HIGH . LOW) or (HIGH LOW). */)
5484 Lisp_Object time_list
;
5486 if (!NILP (time_list
))
5487 current_buffer
->modtime
= cons_to_long (time_list
);
5490 register Lisp_Object filename
;
5492 Lisp_Object handler
;
5494 filename
= Fexpand_file_name (current_buffer
->filename
, Qnil
);
5496 /* If the file name has special constructs in it,
5497 call the corresponding file handler. */
5498 handler
= Ffind_file_name_handler (filename
, Qset_visited_file_modtime
);
5499 if (!NILP (handler
))
5500 /* The handler can find the file name the same way we did. */
5501 return call2 (handler
, Qset_visited_file_modtime
, Qnil
);
5503 filename
= ENCODE_FILE (filename
);
5505 if (stat (SDATA (filename
), &st
) >= 0)
5506 current_buffer
->modtime
= st
.st_mtime
;
5513 auto_save_error (error
)
5516 Lisp_Object args
[3], msg
;
5518 struct gcpro gcpro1
;
5522 args
[0] = build_string ("Auto-saving %s: %s");
5523 args
[1] = current_buffer
->name
;
5524 args
[2] = Ferror_message_string (error
);
5525 msg
= Fformat (3, args
);
5527 nbytes
= SBYTES (msg
);
5529 for (i
= 0; i
< 3; ++i
)
5532 message2 (SDATA (msg
), nbytes
, STRING_MULTIBYTE (msg
));
5534 message2_nolog (SDATA (msg
), nbytes
, STRING_MULTIBYTE (msg
));
5535 Fsleep_for (make_number (1), Qnil
);
5547 /* Get visited file's mode to become the auto save file's mode. */
5548 if (! NILP (current_buffer
->filename
)
5549 && stat (SDATA (current_buffer
->filename
), &st
) >= 0)
5550 /* But make sure we can overwrite it later! */
5551 auto_save_mode_bits
= st
.st_mode
| 0600;
5553 auto_save_mode_bits
= 0666;
5556 Fwrite_region (Qnil
, Qnil
,
5557 current_buffer
->auto_save_file_name
,
5558 Qnil
, Qlambda
, Qnil
, Qnil
);
5562 do_auto_save_unwind (stream
) /* used as unwind-protect function */
5567 fclose ((FILE *) (XFASTINT (XCAR (stream
)) << 16
5568 | XFASTINT (XCDR (stream
))));
5573 do_auto_save_unwind_1 (value
) /* used as unwind-protect function */
5576 minibuffer_auto_raise
= XINT (value
);
5581 do_auto_save_make_dir (dir
)
5584 return call2 (Qmake_directory
, dir
, Qt
);
5588 do_auto_save_eh (ignore
)
5594 DEFUN ("do-auto-save", Fdo_auto_save
, Sdo_auto_save
, 0, 2, "",
5595 doc
: /* Auto-save all buffers that need it.
5596 This is all buffers that have auto-saving enabled
5597 and are changed since last auto-saved.
5598 Auto-saving writes the buffer into a file
5599 so that your editing is not lost if the system crashes.
5600 This file is not the file you visited; that changes only when you save.
5601 Normally we run the normal hook `auto-save-hook' before saving.
5603 A non-nil NO-MESSAGE argument means do not print any message if successful.
5604 A non-nil CURRENT-ONLY argument means save only current buffer. */)
5605 (no_message
, current_only
)
5606 Lisp_Object no_message
, current_only
;
5608 struct buffer
*old
= current_buffer
, *b
;
5609 Lisp_Object tail
, buf
;
5611 int do_handled_files
;
5614 Lisp_Object lispstream
;
5615 int count
= SPECPDL_INDEX ();
5616 int orig_minibuffer_auto_raise
= minibuffer_auto_raise
;
5617 int old_message_p
= 0;
5619 if (max_specpdl_size
< specpdl_size
+ 40)
5620 max_specpdl_size
= specpdl_size
+ 40;
5625 if (NILP (no_message
))
5627 old_message_p
= push_message ();
5628 record_unwind_protect (pop_message_unwind
, Qnil
);
5631 /* Ordinarily don't quit within this function,
5632 but don't make it impossible to quit (in case we get hung in I/O). */
5636 /* No GCPRO needed, because (when it matters) all Lisp_Object variables
5637 point to non-strings reached from Vbuffer_alist. */
5639 if (!NILP (Vrun_hooks
))
5640 call1 (Vrun_hooks
, intern ("auto-save-hook"));
5642 if (STRINGP (Vauto_save_list_file_name
))
5644 Lisp_Object listfile
;
5646 listfile
= Fexpand_file_name (Vauto_save_list_file_name
, Qnil
);
5648 /* Don't try to create the directory when shutting down Emacs,
5649 because creating the directory might signal an error, and
5650 that would leave Emacs in a strange state. */
5651 if (!NILP (Vrun_hooks
))
5654 dir
= Ffile_name_directory (listfile
);
5655 if (NILP (Ffile_directory_p (dir
)))
5656 internal_condition_case_1 (do_auto_save_make_dir
,
5657 dir
, Fcons (Fcons (Qfile_error
, Qnil
), Qnil
),
5661 stream
= fopen (SDATA (listfile
), "w");
5664 /* Arrange to close that file whether or not we get an error.
5665 Also reset auto_saving to 0. */
5666 lispstream
= Fcons (Qnil
, Qnil
);
5667 XSETCARFASTINT (lispstream
, (EMACS_UINT
)stream
>> 16);
5668 XSETCDRFASTINT (lispstream
, (EMACS_UINT
)stream
& 0xffff);
5679 record_unwind_protect (do_auto_save_unwind
, lispstream
);
5680 record_unwind_protect (do_auto_save_unwind_1
,
5681 make_number (minibuffer_auto_raise
));
5682 minibuffer_auto_raise
= 0;
5685 /* First, save all files which don't have handlers. If Emacs is
5686 crashing, the handlers may tweak what is causing Emacs to crash
5687 in the first place, and it would be a shame if Emacs failed to
5688 autosave perfectly ordinary files because it couldn't handle some
5690 for (do_handled_files
= 0; do_handled_files
< 2; do_handled_files
++)
5691 for (tail
= Vbuffer_alist
; GC_CONSP (tail
); tail
= XCDR (tail
))
5693 buf
= XCDR (XCAR (tail
));
5696 /* Record all the buffers that have auto save mode
5697 in the special file that lists them. For each of these buffers,
5698 Record visited name (if any) and auto save name. */
5699 if (STRINGP (b
->auto_save_file_name
)
5700 && stream
!= NULL
&& do_handled_files
== 0)
5702 if (!NILP (b
->filename
))
5704 fwrite (SDATA (b
->filename
), 1,
5705 SBYTES (b
->filename
), stream
);
5707 putc ('\n', stream
);
5708 fwrite (SDATA (b
->auto_save_file_name
), 1,
5709 SBYTES (b
->auto_save_file_name
), stream
);
5710 putc ('\n', stream
);
5713 if (!NILP (current_only
)
5714 && b
!= current_buffer
)
5717 /* Don't auto-save indirect buffers.
5718 The base buffer takes care of it. */
5722 /* Check for auto save enabled
5723 and file changed since last auto save
5724 and file changed since last real save. */
5725 if (STRINGP (b
->auto_save_file_name
)
5726 && BUF_SAVE_MODIFF (b
) < BUF_MODIFF (b
)
5727 && b
->auto_save_modified
< BUF_MODIFF (b
)
5728 /* -1 means we've turned off autosaving for a while--see below. */
5729 && XINT (b
->save_length
) >= 0
5730 && (do_handled_files
5731 || NILP (Ffind_file_name_handler (b
->auto_save_file_name
,
5734 EMACS_TIME before_time
, after_time
;
5736 EMACS_GET_TIME (before_time
);
5738 /* If we had a failure, don't try again for 20 minutes. */
5739 if (b
->auto_save_failure_time
>= 0
5740 && EMACS_SECS (before_time
) - b
->auto_save_failure_time
< 1200)
5743 if ((XFASTINT (b
->save_length
) * 10
5744 > (BUF_Z (b
) - BUF_BEG (b
)) * 13)
5745 /* A short file is likely to change a large fraction;
5746 spare the user annoying messages. */
5747 && XFASTINT (b
->save_length
) > 5000
5748 /* These messages are frequent and annoying for `*mail*'. */
5749 && !EQ (b
->filename
, Qnil
)
5750 && NILP (no_message
))
5752 /* It has shrunk too much; turn off auto-saving here. */
5753 minibuffer_auto_raise
= orig_minibuffer_auto_raise
;
5754 message_with_string ("Buffer %s has shrunk a lot; auto save disabled in that buffer until next real save",
5756 minibuffer_auto_raise
= 0;
5757 /* Turn off auto-saving until there's a real save,
5758 and prevent any more warnings. */
5759 XSETINT (b
->save_length
, -1);
5760 Fsleep_for (make_number (1), Qnil
);
5763 set_buffer_internal (b
);
5764 if (!auto_saved
&& NILP (no_message
))
5765 message1 ("Auto-saving...");
5766 internal_condition_case (auto_save_1
, Qt
, auto_save_error
);
5768 b
->auto_save_modified
= BUF_MODIFF (b
);
5769 XSETFASTINT (current_buffer
->save_length
, Z
- BEG
);
5770 set_buffer_internal (old
);
5772 EMACS_GET_TIME (after_time
);
5774 /* If auto-save took more than 60 seconds,
5775 assume it was an NFS failure that got a timeout. */
5776 if (EMACS_SECS (after_time
) - EMACS_SECS (before_time
) > 60)
5777 b
->auto_save_failure_time
= EMACS_SECS (after_time
);
5781 /* Prevent another auto save till enough input events come in. */
5782 record_auto_save ();
5784 if (auto_saved
&& NILP (no_message
))
5788 /* If we are going to restore an old message,
5789 give time to read ours. */
5790 sit_for (1, 0, 0, 0, 0);
5794 /* If we displayed a message and then restored a state
5795 with no message, leave a "done" message on the screen. */
5796 message1 ("Auto-saving...done");
5801 /* This restores the message-stack status. */
5802 unbind_to (count
, Qnil
);
5806 DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved
,
5807 Sset_buffer_auto_saved
, 0, 0, 0,
5808 doc
: /* Mark current buffer as auto-saved with its current text.
5809 No auto-save file will be written until the buffer changes again. */)
5812 current_buffer
->auto_save_modified
= MODIFF
;
5813 XSETFASTINT (current_buffer
->save_length
, Z
- BEG
);
5814 current_buffer
->auto_save_failure_time
= -1;
5818 DEFUN ("clear-buffer-auto-save-failure", Fclear_buffer_auto_save_failure
,
5819 Sclear_buffer_auto_save_failure
, 0, 0, 0,
5820 doc
: /* Clear any record of a recent auto-save failure in the current buffer. */)
5823 current_buffer
->auto_save_failure_time
= -1;
5827 DEFUN ("recent-auto-save-p", Frecent_auto_save_p
, Srecent_auto_save_p
,
5829 doc
: /* Return t if buffer has been auto-saved since last read in or saved. */)
5832 return (SAVE_MODIFF
< current_buffer
->auto_save_modified
) ? Qt
: Qnil
;
5835 /* Reading and completing file names */
5836 extern Lisp_Object
Ffile_name_completion (), Ffile_name_all_completions ();
5838 /* In the string VAL, change each $ to $$ and return the result. */
5841 double_dollars (val
)
5844 register const unsigned char *old
;
5845 register unsigned char *new;
5849 osize
= SBYTES (val
);
5851 /* Count the number of $ characters. */
5852 for (n
= osize
, count
= 0, old
= SDATA (val
); n
> 0; n
--)
5853 if (*old
++ == '$') count
++;
5857 val
= make_uninit_multibyte_string (SCHARS (val
) + count
,
5860 for (n
= osize
; n
> 0; n
--)
5874 read_file_name_cleanup (arg
)
5877 return (current_buffer
->directory
= arg
);
5880 DEFUN ("read-file-name-internal", Fread_file_name_internal
, Sread_file_name_internal
,
5882 doc
: /* Internal subroutine for read-file-name. Do not call this. */)
5883 (string
, dir
, action
)
5884 Lisp_Object string
, dir
, action
;
5885 /* action is nil for complete, t for return list of completions,
5886 lambda for verify final value */
5888 Lisp_Object name
, specdir
, realdir
, val
, orig_string
;
5890 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
5892 CHECK_STRING (string
);
5899 /* No need to protect ACTION--we only compare it with t and nil. */
5900 GCPRO5 (string
, realdir
, name
, specdir
, orig_string
);
5902 if (SCHARS (string
) == 0)
5904 if (EQ (action
, Qlambda
))
5912 orig_string
= string
;
5913 string
= Fsubstitute_in_file_name (string
);
5914 changed
= NILP (Fstring_equal (string
, orig_string
));
5915 name
= Ffile_name_nondirectory (string
);
5916 val
= Ffile_name_directory (string
);
5918 realdir
= Fexpand_file_name (val
, realdir
);
5923 specdir
= Ffile_name_directory (string
);
5924 val
= Ffile_name_completion (name
, realdir
);
5929 return double_dollars (string
);
5933 if (!NILP (specdir
))
5934 val
= concat2 (specdir
, val
);
5936 return double_dollars (val
);
5939 #endif /* not VMS */
5943 if (EQ (action
, Qt
))
5945 Lisp_Object all
= Ffile_name_all_completions (name
, realdir
);
5949 if (NILP (Vread_file_name_predicate
)
5950 || EQ (Vread_file_name_predicate
, Qfile_exists_p
))
5954 if (EQ (Vread_file_name_predicate
, Qfile_directory_p
))
5956 /* Brute-force speed up for directory checking:
5957 Discard strings which don't end in a slash. */
5958 for (comp
= Qnil
; CONSP (all
); all
= XCDR (all
))
5960 Lisp_Object tem
= XCAR (all
);
5962 if (STRINGP (tem
) &&
5963 (len
= SCHARS (tem
), len
> 0) &&
5964 IS_DIRECTORY_SEP (SREF (tem
, len
-1)))
5965 comp
= Fcons (tem
, comp
);
5971 /* Must do it the hard (and slow) way. */
5972 GCPRO3 (all
, comp
, specdir
);
5973 count
= SPECPDL_INDEX ();
5974 record_unwind_protect (read_file_name_cleanup
, current_buffer
->directory
);
5975 current_buffer
->directory
= realdir
;
5976 for (comp
= Qnil
; CONSP (all
); all
= XCDR (all
))
5977 if (!NILP (call1 (Vread_file_name_predicate
, XCAR (all
))))
5978 comp
= Fcons (XCAR (all
), comp
);
5979 unbind_to (count
, Qnil
);
5982 return Fnreverse (comp
);
5985 /* Only other case actually used is ACTION = lambda */
5987 /* Supposedly this helps commands such as `cd' that read directory names,
5988 but can someone explain how it helps them? -- RMS */
5989 if (SCHARS (name
) == 0)
5992 if (!NILP (Vread_file_name_predicate
))
5993 return call1 (Vread_file_name_predicate
, string
);
5994 return Ffile_exists_p (string
);
5997 DEFUN ("read-file-name", Fread_file_name
, Sread_file_name
, 1, 6, 0,
5998 doc
: /* Read file name, prompting with PROMPT and completing in directory DIR.
5999 Value is not expanded---you must call `expand-file-name' yourself.
6000 Default name to DEFAULT-FILENAME if user enters a null string.
6001 (If DEFAULT-FILENAME is omitted, the visited file name is used,
6002 except that if INITIAL is specified, that combined with DIR is used.)
6003 Fourth arg MUSTMATCH non-nil means require existing file's name.
6004 Non-nil and non-t means also require confirmation after completion.
6005 Fifth arg INITIAL specifies text to start with.
6006 If optional sixth arg PREDICATE is non-nil, possible completions and the
6007 resulting file name must satisfy (funcall PREDICATE NAME).
6008 DIR defaults to current buffer's directory default.
6010 If this command was invoked with the mouse, use a file dialog box if
6011 `use-dialog-box' is non-nil, and the window system or X toolkit in use
6012 provides a file dialog box. */)
6013 (prompt
, dir
, default_filename
, mustmatch
, initial
, predicate
)
6014 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, initial
, predicate
;
6016 Lisp_Object val
, insdef
, tem
;
6017 struct gcpro gcpro1
, gcpro2
;
6018 register char *homedir
;
6019 int replace_in_history
= 0;
6020 int add_to_history
= 0;
6024 dir
= current_buffer
->directory
;
6025 if (NILP (default_filename
))
6026 default_filename
= !NILP (initial
)
6027 ? Fexpand_file_name (initial
, dir
)
6028 : current_buffer
->filename
;
6030 /* If dir starts with user's homedir, change that to ~. */
6031 homedir
= (char *) egetenv ("HOME");
6033 /* homedir can be NULL in temacs, since Vprocess_environment is not
6034 yet set up. We shouldn't crash in that case. */
6037 homedir
= strcpy (alloca (strlen (homedir
) + 1), homedir
);
6038 CORRECT_DIR_SEPS (homedir
);
6043 && !strncmp (homedir
, SDATA (dir
), strlen (homedir
))
6044 && IS_DIRECTORY_SEP (SREF (dir
, strlen (homedir
))))
6046 dir
= make_string (SDATA (dir
) + strlen (homedir
) - 1,
6047 SBYTES (dir
) - strlen (homedir
) + 1);
6050 /* Likewise for default_filename. */
6052 && STRINGP (default_filename
)
6053 && !strncmp (homedir
, SDATA (default_filename
), strlen (homedir
))
6054 && IS_DIRECTORY_SEP (SREF (default_filename
, strlen (homedir
))))
6057 = make_string (SDATA (default_filename
) + strlen (homedir
) - 1,
6058 SBYTES (default_filename
) - strlen (homedir
) + 1);
6059 SSET (default_filename
, 0, '~');
6061 if (!NILP (default_filename
))
6063 CHECK_STRING (default_filename
);
6064 default_filename
= double_dollars (default_filename
);
6067 if (insert_default_directory
&& STRINGP (dir
))
6070 if (!NILP (initial
))
6072 Lisp_Object args
[2], pos
;
6076 insdef
= Fconcat (2, args
);
6077 pos
= make_number (SCHARS (double_dollars (dir
)));
6078 insdef
= Fcons (double_dollars (insdef
), pos
);
6081 insdef
= double_dollars (insdef
);
6083 else if (STRINGP (initial
))
6084 insdef
= Fcons (double_dollars (initial
), make_number (0));
6088 if (!NILP (Vread_file_name_function
))
6090 Lisp_Object args
[7];
6092 GCPRO2 (insdef
, default_filename
);
6093 args
[0] = Vread_file_name_function
;
6096 args
[3] = default_filename
;
6097 args
[4] = mustmatch
;
6099 args
[6] = predicate
;
6100 RETURN_UNGCPRO (Ffuncall (7, args
));
6103 count
= SPECPDL_INDEX ();
6105 specbind (intern ("completion-ignore-case"), Qt
);
6108 specbind (intern ("minibuffer-completing-file-name"), Qt
);
6109 specbind (intern ("read-file-name-predicate"),
6110 (NILP (predicate
) ? Qfile_exists_p
: predicate
));
6112 GCPRO2 (insdef
, default_filename
);
6114 #if defined (USE_MOTIF) || defined (HAVE_NTGUI)
6115 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
6119 /* If DIR contains a file name, split it. */
6121 file
= Ffile_name_nondirectory (dir
);
6122 if (SCHARS (file
) && NILP (default_filename
))
6124 default_filename
= file
;
6125 dir
= Ffile_name_directory (dir
);
6127 if (!NILP(default_filename
))
6128 default_filename
= Fexpand_file_name (default_filename
, dir
);
6129 val
= Fx_file_dialog (prompt
, dir
, default_filename
, mustmatch
);
6134 val
= Fcompleting_read (prompt
, intern ("read-file-name-internal"),
6135 dir
, mustmatch
, insdef
,
6136 Qfile_name_history
, default_filename
, Qnil
);
6138 tem
= Fsymbol_value (Qfile_name_history
);
6139 if (CONSP (tem
) && EQ (XCAR (tem
), val
))
6140 replace_in_history
= 1;
6142 /* If Fcompleting_read returned the inserted default string itself
6143 (rather than a new string with the same contents),
6144 it has to mean that the user typed RET with the minibuffer empty.
6145 In that case, we really want to return ""
6146 so that commands such as set-visited-file-name can distinguish. */
6147 if (EQ (val
, default_filename
))
6149 /* In this case, Fcompleting_read has not added an element
6150 to the history. Maybe we should. */
6151 if (! replace_in_history
)
6157 unbind_to (count
, Qnil
);
6160 error ("No file name specified");
6162 tem
= Fstring_equal (val
, CONSP (insdef
) ? XCAR (insdef
) : insdef
);
6164 if (!NILP (tem
) && !NILP (default_filename
))
6165 val
= default_filename
;
6166 else if (SCHARS (val
) == 0 && NILP (insdef
))
6168 if (!NILP (default_filename
))
6169 val
= default_filename
;
6171 error ("No default file name");
6173 val
= Fsubstitute_in_file_name (val
);
6175 if (replace_in_history
)
6176 /* Replace what Fcompleting_read added to the history
6177 with what we will actually return. */
6178 XSETCAR (Fsymbol_value (Qfile_name_history
), double_dollars (val
));
6179 else if (add_to_history
)
6181 /* Add the value to the history--but not if it matches
6182 the last value already there. */
6183 Lisp_Object val1
= double_dollars (val
);
6184 tem
= Fsymbol_value (Qfile_name_history
);
6185 if (! CONSP (tem
) || NILP (Fequal (XCAR (tem
), val1
)))
6186 Fset (Qfile_name_history
,
6197 /* Must be set before any path manipulation is performed. */
6198 XSETFASTINT (Vdirectory_sep_char
, '/');
6205 Qexpand_file_name
= intern ("expand-file-name");
6206 Qsubstitute_in_file_name
= intern ("substitute-in-file-name");
6207 Qdirectory_file_name
= intern ("directory-file-name");
6208 Qfile_name_directory
= intern ("file-name-directory");
6209 Qfile_name_nondirectory
= intern ("file-name-nondirectory");
6210 Qunhandled_file_name_directory
= intern ("unhandled-file-name-directory");
6211 Qfile_name_as_directory
= intern ("file-name-as-directory");
6212 Qcopy_file
= intern ("copy-file");
6213 Qmake_directory_internal
= intern ("make-directory-internal");
6214 Qmake_directory
= intern ("make-directory");
6215 Qdelete_directory
= intern ("delete-directory");
6216 Qdelete_file
= intern ("delete-file");
6217 Qrename_file
= intern ("rename-file");
6218 Qadd_name_to_file
= intern ("add-name-to-file");
6219 Qmake_symbolic_link
= intern ("make-symbolic-link");
6220 Qfile_exists_p
= intern ("file-exists-p");
6221 Qfile_executable_p
= intern ("file-executable-p");
6222 Qfile_readable_p
= intern ("file-readable-p");
6223 Qfile_writable_p
= intern ("file-writable-p");
6224 Qfile_symlink_p
= intern ("file-symlink-p");
6225 Qaccess_file
= intern ("access-file");
6226 Qfile_directory_p
= intern ("file-directory-p");
6227 Qfile_regular_p
= intern ("file-regular-p");
6228 Qfile_accessible_directory_p
= intern ("file-accessible-directory-p");
6229 Qfile_modes
= intern ("file-modes");
6230 Qset_file_modes
= intern ("set-file-modes");
6231 Qfile_newer_than_file_p
= intern ("file-newer-than-file-p");
6232 Qinsert_file_contents
= intern ("insert-file-contents");
6233 Qwrite_region
= intern ("write-region");
6234 Qverify_visited_file_modtime
= intern ("verify-visited-file-modtime");
6235 Qset_visited_file_modtime
= intern ("set-visited-file-modtime");
6237 staticpro (&Qexpand_file_name
);
6238 staticpro (&Qsubstitute_in_file_name
);
6239 staticpro (&Qdirectory_file_name
);
6240 staticpro (&Qfile_name_directory
);
6241 staticpro (&Qfile_name_nondirectory
);
6242 staticpro (&Qunhandled_file_name_directory
);
6243 staticpro (&Qfile_name_as_directory
);
6244 staticpro (&Qcopy_file
);
6245 staticpro (&Qmake_directory_internal
);
6246 staticpro (&Qmake_directory
);
6247 staticpro (&Qdelete_directory
);
6248 staticpro (&Qdelete_file
);
6249 staticpro (&Qrename_file
);
6250 staticpro (&Qadd_name_to_file
);
6251 staticpro (&Qmake_symbolic_link
);
6252 staticpro (&Qfile_exists_p
);
6253 staticpro (&Qfile_executable_p
);
6254 staticpro (&Qfile_readable_p
);
6255 staticpro (&Qfile_writable_p
);
6256 staticpro (&Qaccess_file
);
6257 staticpro (&Qfile_symlink_p
);
6258 staticpro (&Qfile_directory_p
);
6259 staticpro (&Qfile_regular_p
);
6260 staticpro (&Qfile_accessible_directory_p
);
6261 staticpro (&Qfile_modes
);
6262 staticpro (&Qset_file_modes
);
6263 staticpro (&Qfile_newer_than_file_p
);
6264 staticpro (&Qinsert_file_contents
);
6265 staticpro (&Qwrite_region
);
6266 staticpro (&Qverify_visited_file_modtime
);
6267 staticpro (&Qset_visited_file_modtime
);
6269 Qfile_name_history
= intern ("file-name-history");
6270 Fset (Qfile_name_history
, Qnil
);
6271 staticpro (&Qfile_name_history
);
6273 Qfile_error
= intern ("file-error");
6274 staticpro (&Qfile_error
);
6275 Qfile_already_exists
= intern ("file-already-exists");
6276 staticpro (&Qfile_already_exists
);
6277 Qfile_date_error
= intern ("file-date-error");
6278 staticpro (&Qfile_date_error
);
6279 Qexcl
= intern ("excl");
6283 Qfind_buffer_file_type
= intern ("find-buffer-file-type");
6284 staticpro (&Qfind_buffer_file_type
);
6287 DEFVAR_LISP ("file-name-coding-system", &Vfile_name_coding_system
,
6288 doc
: /* *Coding system for encoding file names.
6289 If it is nil, `default-file-name-coding-system' (which see) is used. */);
6290 Vfile_name_coding_system
= Qnil
;
6292 DEFVAR_LISP ("default-file-name-coding-system",
6293 &Vdefault_file_name_coding_system
,
6294 doc
: /* Default coding system for encoding file names.
6295 This variable is used only when `file-name-coding-system' is nil.
6297 This variable is set/changed by the command `set-language-environment'.
6298 User should not set this variable manually,
6299 instead use `file-name-coding-system' to get a constant encoding
6300 of file names regardless of the current language environment. */);
6301 Vdefault_file_name_coding_system
= Qnil
;
6303 DEFVAR_LISP ("auto-save-file-format", &Vauto_save_file_format
,
6304 doc
: /* *Format in which to write auto-save files.
6305 Should be a list of symbols naming formats that are defined in `format-alist'.
6306 If it is t, which is the default, auto-save files are written in the
6307 same format as a regular save would use. */);
6308 Vauto_save_file_format
= Qt
;
6310 Qformat_decode
= intern ("format-decode");
6311 staticpro (&Qformat_decode
);
6312 Qformat_annotate_function
= intern ("format-annotate-function");
6313 staticpro (&Qformat_annotate_function
);
6315 Qcar_less_than_car
= intern ("car-less-than-car");
6316 staticpro (&Qcar_less_than_car
);
6318 Fput (Qfile_error
, Qerror_conditions
,
6319 Fcons (Qfile_error
, Fcons (Qerror
, Qnil
)));
6320 Fput (Qfile_error
, Qerror_message
,
6321 build_string ("File error"));
6323 Fput (Qfile_already_exists
, Qerror_conditions
,
6324 Fcons (Qfile_already_exists
,
6325 Fcons (Qfile_error
, Fcons (Qerror
, Qnil
))));
6326 Fput (Qfile_already_exists
, Qerror_message
,
6327 build_string ("File already exists"));
6329 Fput (Qfile_date_error
, Qerror_conditions
,
6330 Fcons (Qfile_date_error
,
6331 Fcons (Qfile_error
, Fcons (Qerror
, Qnil
))));
6332 Fput (Qfile_date_error
, Qerror_message
,
6333 build_string ("Cannot set file date"));
6335 DEFVAR_LISP ("read-file-name-function", &Vread_file_name_function
,
6336 doc
: /* If this is non-nil, `read-file-name' does its work by calling this function. */);
6337 Vread_file_name_function
= Qnil
;
6339 DEFVAR_LISP ("read-file-name-predicate", &Vread_file_name_predicate
,
6340 doc
: /* Current predicate used by `read-file-name-internal'. */);
6341 Vread_file_name_predicate
= Qnil
;
6343 DEFVAR_BOOL ("insert-default-directory", &insert_default_directory
,
6344 doc
: /* *Non-nil means when reading a filename start with default dir in minibuffer. */);
6345 insert_default_directory
= 1;
6347 DEFVAR_BOOL ("vms-stmlf-recfm", &vms_stmlf_recfm
,
6348 doc
: /* *Non-nil means write new files with record format `stmlf'.
6349 nil means use format `var'. This variable is meaningful only on VMS. */);
6350 vms_stmlf_recfm
= 0;
6352 DEFVAR_LISP ("directory-sep-char", &Vdirectory_sep_char
,
6353 doc
: /* Directory separator character for built-in functions that return file names.
6354 The value should be either ?/ or ?\\ (any other value is treated as ?\\).
6355 This variable affects the built-in functions only on Windows,
6356 on other platforms, it is initialized so that Lisp code can find out
6357 what the normal separator is. */);
6359 DEFVAR_LISP ("file-name-handler-alist", &Vfile_name_handler_alist
,
6360 doc
: /* *Alist of elements (REGEXP . HANDLER) for file names handled specially.
6361 If a file name matches REGEXP, then all I/O on that file is done by calling
6364 The first argument given to HANDLER is the name of the I/O primitive
6365 to be handled; the remaining arguments are the arguments that were
6366 passed to that primitive. For example, if you do
6367 (file-exists-p FILENAME)
6368 and FILENAME is handled by HANDLER, then HANDLER is called like this:
6369 (funcall HANDLER 'file-exists-p FILENAME)
6370 The function `find-file-name-handler' checks this list for a handler
6371 for its argument. */);
6372 Vfile_name_handler_alist
= Qnil
;
6374 DEFVAR_LISP ("set-auto-coding-function",
6375 &Vset_auto_coding_function
,
6376 doc
: /* If non-nil, a function to call to decide a coding system of file.
6377 Two arguments are passed to this function: the file name
6378 and the length of a file contents following the point.
6379 This function should return a coding system to decode the file contents.
6380 It should check the file name against `auto-coding-alist'.
6381 If no coding system is decided, it should check a coding system
6382 specified in the heading lines with the format:
6383 -*- ... coding: CODING-SYSTEM; ... -*-
6384 or local variable spec of the tailing lines with `coding:' tag. */);
6385 Vset_auto_coding_function
= Qnil
;
6387 DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions
,
6388 doc
: /* A list of functions to be called at the end of `insert-file-contents'.
6389 Each is passed one argument, the number of bytes inserted. It should return
6390 the new byte count, and leave point the same. If `insert-file-contents' is
6391 intercepted by a handler from `file-name-handler-alist', that handler is
6392 responsible for calling the after-insert-file-functions if appropriate. */);
6393 Vafter_insert_file_functions
= Qnil
;
6395 DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions
,
6396 doc
: /* A list of functions to be called at the start of `write-region'.
6397 Each is passed two arguments, START and END as for `write-region'.
6398 These are usually two numbers but not always; see the documentation
6399 for `write-region'. The function should return a list of pairs
6400 of the form (POSITION . STRING), consisting of strings to be effectively
6401 inserted at the specified positions of the file being written (1 means to
6402 insert before the first byte written). The POSITIONs must be sorted into
6403 increasing order. If there are several functions in the list, the several
6404 lists are merged destructively. Alternatively, the function can return
6405 with a different buffer current and value nil.*/);
6406 Vwrite_region_annotate_functions
= Qnil
;
6408 DEFVAR_LISP ("write-region-annotations-so-far",
6409 &Vwrite_region_annotations_so_far
,
6410 doc
: /* When an annotation function is called, this holds the previous annotations.
6411 These are the annotations made by other annotation functions
6412 that were already called. See also `write-region-annotate-functions'. */);
6413 Vwrite_region_annotations_so_far
= Qnil
;
6415 DEFVAR_LISP ("inhibit-file-name-handlers", &Vinhibit_file_name_handlers
,
6416 doc
: /* A list of file name handlers that temporarily should not be used.
6417 This applies only to the operation `inhibit-file-name-operation'. */);
6418 Vinhibit_file_name_handlers
= Qnil
;
6420 DEFVAR_LISP ("inhibit-file-name-operation", &Vinhibit_file_name_operation
,
6421 doc
: /* The operation for which `inhibit-file-name-handlers' is applicable. */);
6422 Vinhibit_file_name_operation
= Qnil
;
6424 DEFVAR_LISP ("auto-save-list-file-name", &Vauto_save_list_file_name
,
6425 doc
: /* File name in which we write a list of all auto save file names.
6426 This variable is initialized automatically from `auto-save-list-file-prefix'
6427 shortly after Emacs reads your `.emacs' file, if you have not yet given it
6428 a non-nil value. */);
6429 Vauto_save_list_file_name
= Qnil
;
6431 defsubr (&Sfind_file_name_handler
);
6432 defsubr (&Sfile_name_directory
);
6433 defsubr (&Sfile_name_nondirectory
);
6434 defsubr (&Sunhandled_file_name_directory
);
6435 defsubr (&Sfile_name_as_directory
);
6436 defsubr (&Sdirectory_file_name
);
6437 defsubr (&Smake_temp_name
);
6438 defsubr (&Sexpand_file_name
);
6439 defsubr (&Ssubstitute_in_file_name
);
6440 defsubr (&Scopy_file
);
6441 defsubr (&Smake_directory_internal
);
6442 defsubr (&Sdelete_directory
);
6443 defsubr (&Sdelete_file
);
6444 defsubr (&Srename_file
);
6445 defsubr (&Sadd_name_to_file
);
6447 defsubr (&Smake_symbolic_link
);
6448 #endif /* S_IFLNK */
6450 defsubr (&Sdefine_logical_name
);
6453 defsubr (&Ssysnetunam
);
6454 #endif /* HPUX_NET */
6455 defsubr (&Sfile_name_absolute_p
);
6456 defsubr (&Sfile_exists_p
);
6457 defsubr (&Sfile_executable_p
);
6458 defsubr (&Sfile_readable_p
);
6459 defsubr (&Sfile_writable_p
);
6460 defsubr (&Saccess_file
);
6461 defsubr (&Sfile_symlink_p
);
6462 defsubr (&Sfile_directory_p
);
6463 defsubr (&Sfile_accessible_directory_p
);
6464 defsubr (&Sfile_regular_p
);
6465 defsubr (&Sfile_modes
);
6466 defsubr (&Sset_file_modes
);
6467 defsubr (&Sset_default_file_modes
);
6468 defsubr (&Sdefault_file_modes
);
6469 defsubr (&Sfile_newer_than_file_p
);
6470 defsubr (&Sinsert_file_contents
);
6471 defsubr (&Swrite_region
);
6472 defsubr (&Scar_less_than_car
);
6473 defsubr (&Sverify_visited_file_modtime
);
6474 defsubr (&Sclear_visited_file_modtime
);
6475 defsubr (&Svisited_file_modtime
);
6476 defsubr (&Sset_visited_file_modtime
);
6477 defsubr (&Sdo_auto_save
);
6478 defsubr (&Sset_buffer_auto_saved
);
6479 defsubr (&Sclear_buffer_auto_save_failure
);
6480 defsubr (&Srecent_auto_save_p
);
6482 defsubr (&Sread_file_name_internal
);
6483 defsubr (&Sread_file_name
);
6486 defsubr (&Sunix_sync
);