annotate src/fileio.c @ 15097:32c26cb9e078

(Fexpand_file_name, Ffile_name_absolute_p): Doc fixes. (Ffile_exists_p, Ffile_executable_p, Ffile_readable_p) (Ffile_writable_p, Ffile_directory_p, Ffile_regular_p) (Ffile_modes, Fset_file_modes, Ffile_newer_than_file_p) (expand_and_dir_to_file): Rename abspath to absname. (CORRECT_DIR_SEPS) [DOS_NT]: New macro. (IS_DRIVE) [DOS_NT]: Added separate definitions for DOS and NT. (Ffile_name_directory) [DOS_NT]: Simplify code to match change in getdefdir in msdos.c. Ignore embedded colons. Correct dir seps. (Ffile_name_nondirectory) [DOS_NT]: Ignore embedded colons. Correct IS_ANY_SEP to IS_DIRECTORY_SEP. (file_name_as_directory) [DOS_NT]: Correct dir seps. Correct IS_ANY_SEP to IS_DIRECTORY_SEP. (directory_file_name) [DOS_NT]: Correct dir seps. (Fmake_temp_name) [DOS_NT: Correct dir seps. (Fexpand_file_name) [mostly DOS_NT]: Remove relpath, tmp and defdir variables; init drive to 0. Correctly detect when default_directory is absolute. Be strict when looking for MSDOS drive specifier; defer calling getdefdir. Ignore drive specifier if name now has UNC prefix. Correctly recognise if name is not absolute when trying simple method to expand; return original string if possible. Skip dir sep after ~ or ~user. Use getpwnam instead of HOME for ~user on NT. Handle error return from getdefdir. Correctly detect if newdir is absolute before using default_directory. Handle case where newdir is not absolute - expand relative to current working dir if necessary (instead of calling getdisk later). Only keep UNC prefix if nm starts with dir sep. Replace kludgy handling of drive spec in newdir. Correct dir seps. (Fexpand_file_name) [!DOS_NT]: Fix incorrect expansion of "/foo/../bar" -> "//bar". (Fsubstitute_in_file_name) [DOS_NT]: Correct dir seps for NT as well. Merge equivalent #ifdef APOLLO and WINDOWSNT cases. Ignore embedded colons and be strict about drive specs. (Fcopy_file) [DOS_NT]: Do dev/inode check on NT. (Ffile_name_absolute_p) [DOS_NT]: Be strict about drive specs. (check_executable) [DOS_NT]: Test st_mode on NT. (Ffile_readable_p) [DOS_NT]: Use access instead of open on NT. (Ffile_modes) [DOS_NT]: Don't embelish st_mode value on NT. (Fread_file_name) [DOS_NT]: Correct dir seps in HOME. (syms_of_fileio): Add Vdirectory_sep_char.
author Richard M. Stallman <rms@gnu.org>
date Sat, 27 Apr 1996 01:14:17 +0000
parents ff25c6944c3d
children b801c02f3e92
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* File IO for GNU Emacs.
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2 Copyright (C) 1985,86,87,88,93,94,95,96 Free Software Foundation, Inc.
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
621
eca8812e61cd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 595
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 any later version.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU General Public License for more details.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14128
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14128
diff changeset
19 Boston, MA 02111-1307, USA. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4483
diff changeset
21 #include <config.h>
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 #include <sys/types.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 #include <sys/stat.h>
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
25
6862
653504b6b5dd [HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents: 6678
diff changeset
26 #ifdef HAVE_UNISTD_H
653504b6b5dd [HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents: 6678
diff changeset
27 #include <unistd.h>
653504b6b5dd [HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents: 6678
diff changeset
28 #endif
653504b6b5dd [HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents: 6678
diff changeset
29
4879
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
30 #if !defined (S_ISLNK) && defined (S_IFLNK)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
31 # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
32 #endif
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
33
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
34 #if !defined (S_ISREG) && defined (S_IFREG)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
35 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
36 #endif
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
37
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
38 #ifdef VMS
564
d909f2be7ee1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 550
diff changeset
39 #include "vms-pwd.h"
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
40 #else
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 #include <pwd.h>
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
42 #endif
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
43
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
44 #ifdef MSDOS
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
45 #include "msdos.h"
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
46 #include <sys/param.h>
14973
1a852b90dc3e [MSDOS]: If DJGPP version 2, include fcntl.h and string.h.
Richard M. Stallman <rms@gnu.org>
parents: 14906
diff changeset
47 #if __DJGPP__ >= 2
1a852b90dc3e [MSDOS]: If DJGPP version 2, include fcntl.h and string.h.
Richard M. Stallman <rms@gnu.org>
parents: 14906
diff changeset
48 #include <fcntl.h>
1a852b90dc3e [MSDOS]: If DJGPP version 2, include fcntl.h and string.h.
Richard M. Stallman <rms@gnu.org>
parents: 14906
diff changeset
49 #include <string.h>
1a852b90dc3e [MSDOS]: If DJGPP version 2, include fcntl.h and string.h.
Richard M. Stallman <rms@gnu.org>
parents: 14906
diff changeset
50 #endif
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
51 #endif
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
52
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 #include <ctype.h>
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
54
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
55 #ifdef VMS
5877
321b22a46f7a Use new name vmsdir.h.
Richard M. Stallman <rms@gnu.org>
parents: 5875
diff changeset
56 #include "vmsdir.h"
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
57 #include <perror.h>
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
58 #include <stddef.h>
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
59 #include <string.h>
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
60 #endif
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
61
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 #include <errno.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
64 #ifndef vax11c
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 extern int errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67
5517
8b2b6a296cda Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents: 5494
diff changeset
68 extern char *strerror ();
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 #ifdef APOLLO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 #include <sys/time.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73
2280
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
74 #ifndef USG
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
75 #ifndef VMS
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
76 #ifndef BSD4_1
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
77 #ifndef WINDOWSNT
2280
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
78 #define HAVE_FSYNC
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
79 #endif
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
80 #endif
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
81 #endif
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
82 #endif
2280
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
83
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 #include "lisp.h"
1299
b8337cdf2e8b * fileio.c (Finsert_file_contents): Call offset_intervals() if
Joseph Arceneaux <jla@gnu.org>
parents: 1240
diff changeset
85 #include "intervals.h"
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 #include "buffer.h"
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 #include "window.h"
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
89 #ifdef WINDOWSNT
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
90 #define NOMINMAX 1
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
91 #include <windows.h>
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
92 #include <stdlib.h>
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
93 #include <fcntl.h>
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
94 #endif /* not WINDOWSNT */
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
95
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
96 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
97 #define CORRECT_DIR_SEPS(s) \
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
98 do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
99 else unixtodos_filename (s); \
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
100 } while (0)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
101 /* On Windows, drive letters must be alphabetic - on DOS, the Netware
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
102 redirector allows the six letters between 'Z' and 'a' as well. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
103 #ifdef MSDOS
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
104 #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
105 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
106 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
107 #define IS_DRIVE(x) isalpha (x)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
108 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
109 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
110
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 #include <file.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 #include <rmsdef.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 #include <fab.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 #include <nam.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117
564
d909f2be7ee1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 550
diff changeset
118 #include "systime.h"
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 #ifdef HPUX
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 #include <netio.h>
350
80a890dbbeb5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 230
diff changeset
122 #ifndef HPUX8
3410
47b51faf6c4e [HPUX9]: Don't include errnet.h.
Richard M. Stallman <rms@gnu.org>
parents: 3032
diff changeset
123 #ifndef HPUX9
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 #include <errnet.h>
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 #endif
350
80a890dbbeb5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 230
diff changeset
126 #endif
3410
47b51faf6c4e [HPUX9]: Don't include errnet.h.
Richard M. Stallman <rms@gnu.org>
parents: 3032
diff changeset
127 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 #ifndef O_WRONLY
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 #define O_WRONLY 1
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
133 #ifndef O_RDONLY
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
134 #define O_RDONLY 0
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
135 #endif
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
136
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 #define min(a, b) ((a) < (b) ? (a) : (b))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 #define max(a, b) ((a) > (b) ? (a) : (b))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 /* Nonzero during writing of auto-save files */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 int auto_saving;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 /* Set by auto_save_1 to mode of original file so Fwrite_region will create
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 a new file with the same mode as the original */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 int auto_save_mode_bits;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
147 /* Alist of elements (REGEXP . HANDLER) for file names
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
148 whose I/O is done with a special handler. */
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
149 Lisp_Object Vfile_name_handler_alist;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
150
11053
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
151 /* Format for auto-save files */
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
152 Lisp_Object Vauto_save_file_format;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
153
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
154 /* Lisp functions for translating file formats */
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
155 Lisp_Object Qformat_decode, Qformat_annotate_function;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
156
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
157 /* Functions to be called to process text properties in inserted file. */
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
158 Lisp_Object Vafter_insert_file_functions;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
159
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
160 /* Functions to be called to create text property annotations for file. */
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
161 Lisp_Object Vwrite_region_annotate_functions;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
162
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
163 /* During build_annotations, each time an annotation function is called,
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
164 this holds the annotations made by the previous functions. */
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
165 Lisp_Object Vwrite_region_annotations_so_far;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
166
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
167 /* File name in which we write a list of all our auto save files. */
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
168 Lisp_Object Vauto_save_list_file_name;
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
169
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 /* Nonzero means, when reading a filename in the minibuffer,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 start out by inserting the default directory into the minibuffer. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 int insert_default_directory;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 /* On VMS, nonzero means write new files with record format stmlf.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 Zero means use var format. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 int vms_stmlf_recfm;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
178 /* On NT, specifies the directory separator character, used (eg.) when
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
179 expanding file names. This can be bound to / or \. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
180 Lisp_Object Vdirectory_sep_char;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
181
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
182 /* These variables describe handlers that have "already" had a chance
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
183 to handle the current operation.
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
184
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
185 Vinhibit_file_name_handlers is a list of file name handlers.
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
186 Vinhibit_file_name_operation is the operation being handled.
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
187 If we try to handle that operation, we ignore those handlers. */
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
188
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
189 static Lisp_Object Vinhibit_file_name_handlers;
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
190 static Lisp_Object Vinhibit_file_name_operation;
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
191
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 Lisp_Object Qfile_error, Qfile_already_exists;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
194 Lisp_Object Qfile_name_history;
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
195
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
196 Lisp_Object Qcar_less_than_car;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
197
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 report_file_error (string, data)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 char *string;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200 Lisp_Object data;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 Lisp_Object errstring;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203
5529
708b422cf8df (report_file_error): Use strerror instead of sys_errlist.
Roland McGrath <roland@gnu.org>
parents: 5517
diff changeset
204 errstring = build_string (strerror (errno));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 /* System error messages are capitalized. Downcase the initial
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 unless it is followed by a slash. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 if (XSTRING (errstring)->data[1] != '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 XSTRING (errstring)->data[0] = DOWNCASE (XSTRING (errstring)->data[0]);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 while (1)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 Fsignal (Qfile_error,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 Fcons (build_string (string), Fcons (errstring, data)));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214 }
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
215
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
216 close_file_unwind (fd)
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
217 Lisp_Object fd;
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
218 {
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
219 close (XFASTINT (fd));
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
220 }
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
221
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
222 /* Restore point, having saved it as a marker. */
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
223
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
224 restore_point_unwind (location)
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
225 Lisp_Object location;
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
226 {
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
227 SET_PT (marker_position (location));
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
228 Fset_marker (location, Qnil, Qnil);
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
229 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
231 Lisp_Object Qexpand_file_name;
10719
40ae63b409f4 (Fexpand_file_name): Look for a handler for defalt.
Richard M. Stallman <rms@gnu.org>
parents: 10499
diff changeset
232 Lisp_Object Qsubstitute_in_file_name;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
233 Lisp_Object Qdirectory_file_name;
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
234 Lisp_Object Qfile_name_directory;
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
235 Lisp_Object Qfile_name_nondirectory;
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
236 Lisp_Object Qunhandled_file_name_directory;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
237 Lisp_Object Qfile_name_as_directory;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
238 Lisp_Object Qcopy_file;
8227
0e6b7eeedc3b (Fmake_directory_internal): Use Qmake_directory_internal.
Richard M. Stallman <rms@gnu.org>
parents: 8185
diff changeset
239 Lisp_Object Qmake_directory_internal;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
240 Lisp_Object Qdelete_directory;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
241 Lisp_Object Qdelete_file;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
242 Lisp_Object Qrename_file;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
243 Lisp_Object Qadd_name_to_file;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
244 Lisp_Object Qmake_symbolic_link;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
245 Lisp_Object Qfile_exists_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
246 Lisp_Object Qfile_executable_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
247 Lisp_Object Qfile_readable_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
248 Lisp_Object Qfile_symlink_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
249 Lisp_Object Qfile_writable_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
250 Lisp_Object Qfile_directory_p;
11599
51bc10be0dc7 (Ffile_regular_p): Use Qfile_regular_p.
Richard M. Stallman <rms@gnu.org>
parents: 11426
diff changeset
251 Lisp_Object Qfile_regular_p;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
252 Lisp_Object Qfile_accessible_directory_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
253 Lisp_Object Qfile_modes;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
254 Lisp_Object Qset_file_modes;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
255 Lisp_Object Qfile_newer_than_file_p;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
256 Lisp_Object Qinsert_file_contents;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
257 Lisp_Object Qwrite_region;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
258 Lisp_Object Qverify_visited_file_modtime;
3560
95021dcb923b (syms_of_fileio): Set up Qset_visited_file_modtime.
Richard M. Stallman <rms@gnu.org>
parents: 3415
diff changeset
259 Lisp_Object Qset_visited_file_modtime;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
260
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
261 DEFUN ("find-file-name-handler", Ffind_file_name_handler, Sfind_file_name_handler, 2, 2, 0,
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
262 "Return FILENAME's handler function for OPERATION, if it has one.\n\
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
263 Otherwise, return nil.\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
264 A file name is handled if one of the regular expressions in\n\
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
265 `file-name-handler-alist' matches it.\n\n\
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
266 If OPERATION equals `inhibit-file-name-operation', then we ignore\n\
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
267 any handlers that are members of `inhibit-file-name-handlers',\n\
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
268 but we still do run any other handlers. This lets handlers\n\
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
269 use the standard functions without calling themselves recursively.")
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
270 (filename, operation)
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
271 Lisp_Object filename, operation;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
272 {
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
273 /* This function must not munge the match data. */
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
274 Lisp_Object chain, inhibited_handlers;
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
275
2895
1ed91566882a * fileio.c (Ffind_file_name_handler): Check that FILENAME is a
Jim Blandy <jimb@redhat.com>
parents: 2741
diff changeset
276 CHECK_STRING (filename, 0);
1ed91566882a * fileio.c (Ffind_file_name_handler): Check that FILENAME is a
Jim Blandy <jimb@redhat.com>
parents: 2741
diff changeset
277
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
278 if (EQ (operation, Vinhibit_file_name_operation))
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
279 inhibited_handlers = Vinhibit_file_name_handlers;
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
280 else
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
281 inhibited_handlers = Qnil;
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
282
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
283 for (chain = Vfile_name_handler_alist; CONSP (chain);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
284 chain = XCONS (chain)->cdr)
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
285 {
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
286 Lisp_Object elt;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
287 elt = XCONS (chain)->car;
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
288 if (CONSP (elt))
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
289 {
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
290 Lisp_Object string;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
291 string = XCONS (elt)->car;
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
292 if (STRINGP (string) && fast_string_match (string, filename) >= 0)
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
293 {
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
294 Lisp_Object handler, tem;
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
295
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
296 handler = XCONS (elt)->cdr;
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
297 tem = Fmemq (handler, inhibited_handlers);
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
298 if (NILP (tem))
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
299 return handler;
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
300 }
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
301 }
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
302
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
303 QUIT;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
304 }
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
305 return Qnil;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
306 }
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
307
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308 DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 1, 1, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
310 "Return the directory component in file name FILENAME.\n\
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
311 Return nil if FILENAME does not include a directory.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 Otherwise return a directory spec.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 Given a Unix syntax file name, returns a string ending in slash;\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 on VMS, perhaps instead a string ending in `:', `]' or `>'.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
315 (filename)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
316 Lisp_Object filename;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 register unsigned char *beg;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 register unsigned char *p;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
320 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
322 CHECK_STRING (filename, 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
324 /* If the file name has special constructs in it,
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
325 call the corresponding file handler. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
326 handler = Ffind_file_name_handler (filename, Qfile_name_directory);
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
327 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
328 return call2 (handler, Qfile_name_directory, filename);
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
329
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
330 #ifdef FILE_SYSTEM_CASE
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
331 filename = FILE_SYSTEM_CASE (filename);
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
332 #endif
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
333 beg = XSTRING (filename)->data;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
334 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
335 beg = strcpy (alloca (strlen (beg) + 1), beg);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
336 #endif
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
337 p = beg + XSTRING (filename)->size;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
339 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342 #endif /* VMS */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
343 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
344 /* only recognise drive specifier at beginning */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
345 && !(p[-1] == ':' && p == beg + 2)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
346 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 ) p--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
349 if (p == beg)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
350 return Qnil;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
351 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
352 /* Expansion of "c:" to drive and default directory. */
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
353 if (p == beg + 2 && beg[1] == ':')
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
354 {
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
355 /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
356 unsigned char *res = alloca (MAXPATHLEN + 1);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
357 if (getdefdir (toupper (*beg) - 'A' + 1, res))
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
358 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
359 if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
360 strcat (res, "/");
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
361 beg = res;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
362 p = beg + strlen (beg);
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
363 }
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
364 }
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
365 CORRECT_DIR_SEPS (beg);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
366 #endif /* DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 return make_string (beg, p - beg);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, Sfile_name_nondirectory,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 1, 1, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
372 "Return file name FILENAME sans its directory.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 For example, in a Unix-syntax file name,\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 this is everything after the last slash,\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 or the entire name if it contains no slash.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
376 (filename)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
377 Lisp_Object filename;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379 register unsigned char *beg, *p, *end;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
380 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
382 CHECK_STRING (filename, 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
384 /* If the file name has special constructs in it,
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
385 call the corresponding file handler. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
386 handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory);
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
387 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
388 return call2 (handler, Qfile_name_nondirectory, filename);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
389
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
390 beg = XSTRING (filename)->data;
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
391 end = p = beg + XSTRING (filename)->size;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
392
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
393 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 #endif /* VMS */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
397 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
398 /* only recognise drive specifier at beginning */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
399 && !(p[-1] == ':' && p == beg + 2)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
400 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 ) p--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 return make_string (p, end - p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 }
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
405
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
406 DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory, Sunhandled_file_name_directory, 1, 1, 0,
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
407 "Return a directly usable directory name somehow associated with FILENAME.\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
408 A `directly usable' directory name is one that may be used without the\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
409 intervention of any file handler.\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
410 If FILENAME is a directly usable file itself, return\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
411 (file-name-directory FILENAME).\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
412 The `call-process' and `start-process' functions use this function to\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
413 get a current directory to run processes in.")
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
414 (filename)
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
415 Lisp_Object filename;
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
416 {
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
417 Lisp_Object handler;
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
418
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
419 /* If the file name has special constructs in it,
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
420 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
421 handler = Ffind_file_name_handler (filename, Qunhandled_file_name_directory);
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
422 if (!NILP (handler))
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
423 return call2 (handler, Qunhandled_file_name_directory, filename);
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
424
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
425 return Ffile_name_directory (filename);
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
426 }
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
427
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
428
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 char *
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 file_name_as_directory (out, in)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431 char *out, *in;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
432 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433 int size = strlen (in) - 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
434
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
435 strcpy (out, in);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
436
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
437 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
438 /* Is it already a directory string? */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
439 if (in[size] == ':' || in[size] == ']' || in[size] == '>')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
440 return out;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
441 /* Is it a VMS directory file name? If so, hack VMS syntax. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
442 else if (! index (in, '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
443 && ((size > 3 && ! strcmp (&in[size - 3], ".DIR"))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
444 || (size > 3 && ! strcmp (&in[size - 3], ".dir"))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
445 || (size > 5 && (! strncmp (&in[size - 5], ".DIR", 4)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
446 || ! strncmp (&in[size - 5], ".dir", 4))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447 && (in[size - 1] == '.' || in[size - 1] == ';')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
448 && in[size] == '1')))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
449 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
450 register char *p, *dot;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
451 char brack;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
452
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
453 /* x.dir -> [.x]
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
454 dir:x.dir --> dir:[x]
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
455 dir:[x]y.dir --> dir:[x.y] */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
456 p = in + size;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
457 while (p != in && *p != ':' && *p != '>' && *p != ']') p--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
458 if (p != in)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
460 strncpy (out, in, p - in);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 out[p - in] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
462 if (*p == ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
463 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
464 brack = ']';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
465 strcat (out, ":[");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
466 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
467 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
468 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
469 brack = *p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
470 strcat (out, ".");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
471 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
473 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
474 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
475 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
476 brack = ']';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
477 strcpy (out, "[.");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
478 }
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
479 dot = index (p, '.');
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
480 if (dot)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
481 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
482 /* blindly remove any extension */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
483 size = strlen (out) + (dot - p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
484 strncat (out, p, dot - p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
487 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
488 strcat (out, p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 size = strlen (out);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491 out[size++] = brack;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
492 out[size] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
494 #else /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
495 /* For Unix syntax, Append a slash if necessary */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
496 if (!IS_DIRECTORY_SEP (out[size]))
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
497 {
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
498 out[size + 1] = DIRECTORY_SEP;
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
499 out[size + 2] = '\0';
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
500 }
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
501 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
502 CORRECT_DIR_SEPS (out);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
503 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 #endif /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
505 return out;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
506 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
507
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508 DEFUN ("file-name-as-directory", Ffile_name_as_directory,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509 Sfile_name_as_directory, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 "Return a string representing file FILENAME interpreted as a directory.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
511 This operation exists because a directory is also a file, but its name as\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
512 a directory is different from its name as a file.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
513 The result can be used as the value of `default-directory'\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
514 or passed as second argument to `expand-file-name'.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 For a Unix-syntax file name, just appends a slash.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
516 On VMS, converts \"[X]FOO.DIR\" to \"[X.FOO]\", etc.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 (file)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 Lisp_Object file;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
520 char *buf;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
521 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
522
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
523 CHECK_STRING (file, 0);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
524 if (NILP (file))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
525 return Qnil;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
526
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
527 /* If the file name has special constructs in it,
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
528 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
529 handler = Ffind_file_name_handler (file, Qfile_name_as_directory);
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
530 if (!NILP (handler))
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
531 return call2 (handler, Qfile_name_as_directory, file);
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
532
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
533 buf = (char *) alloca (XSTRING (file)->size + 10);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 return build_string (file_name_as_directory (buf, XSTRING (file)->data));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537 /*
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
538 * Convert from directory name to filename.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
539 * On VMS:
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
540 * xyzzy:[mukesh.emacs] => xyzzy:[mukesh]emacs.dir.1
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
541 * xyzzy:[mukesh] => xyzzy:[000000]mukesh.dir.1
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
542 * On UNIX, it's simple: just make sure there isn't a terminating /
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
543
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
544 * Value is nonzero if the string output is different from the input.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
546
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547 directory_file_name (src, dst)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
548 char *src, *dst;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
549 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 long slen;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
551 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 long rlen;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 char * ptr, * rptr;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
554 char bracket;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
555 struct FAB fab = cc$rms_fab;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
556 struct NAM nam = cc$rms_nam;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 char esa[NAM$C_MAXRSS];
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
559
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
560 slen = strlen (src);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
562 if (! index (src, '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
563 && (src[slen - 1] == ']'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 || src[slen - 1] == ':'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
565 || src[slen - 1] == '>'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
566 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
567 /* VMS style - convert [x.y.z] to [x.y]z, [x] to [000000]x */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 fab.fab$l_fna = src;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
569 fab.fab$b_fns = slen;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
570 fab.fab$l_nam = &nam;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
571 fab.fab$l_fop = FAB$M_NAM;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 nam.nam$l_esa = esa;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574 nam.nam$b_ess = sizeof esa;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 nam.nam$b_nop |= NAM$M_SYNCHK;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577 /* We call SYS$PARSE to handle such things as [--] for us. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
578 if (SYS$PARSE (&fab, 0, 0) == RMS$_NORMAL)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
579 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
580 slen = nam.nam$b_esl;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
581 if (esa[slen - 1] == ';' && esa[slen - 2] == '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582 slen -= 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
583 esa[slen] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
584 src = esa;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
585 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
586 if (src[slen - 1] != ']' && src[slen - 1] != '>')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
587 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
588 /* what about when we have logical_name:???? */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
589 if (src[slen - 1] == ':')
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
590 { /* Xlate logical name and see what we get */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591 ptr = strcpy (dst, src); /* upper case for getenv */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592 while (*ptr)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
593 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
594 if ('a' <= *ptr && *ptr <= 'z')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595 *ptr -= 040;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
596 ptr++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
597 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
598 dst[slen - 1] = 0; /* remove colon */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
599 if (!(src = egetenv (dst)))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600 return 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
601 /* should we jump to the beginning of this procedure?
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
602 Good points: allows us to use logical names that xlate
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
603 to Unix names,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 Bad points: can be a problem if we just translated to a device
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
605 name...
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
606 For now, I'll punt and always expect VMS names, and hope for
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
607 the best! */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
608 slen = strlen (src);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
609 if (src[slen - 1] != ']' && src[slen - 1] != '>')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
610 { /* no recursion here! */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
611 strcpy (dst, src);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
612 return 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
613 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
614 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
615 else
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
616 { /* not a directory spec */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
617 strcpy (dst, src);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
618 return 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
619 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
620 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
621 bracket = src[slen - 1];
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
622
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
623 /* If bracket is ']' or '>', bracket - 2 is the corresponding
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
624 opening bracket. */
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
625 ptr = index (src, bracket - 2);
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
626 if (ptr == 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
627 { /* no opening bracket */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
628 strcpy (dst, src);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
629 return 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
630 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
631 if (!(rptr = rindex (src, '.')))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
632 rptr = ptr;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
633 slen = rptr - src;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
634 strncpy (dst, src, slen);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635 dst[slen] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
636 if (*rptr == '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
637 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
638 dst[slen++] = bracket;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
639 dst[slen] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
641 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
643 /* If we have the top-level of a rooted directory (i.e. xx:[000000]),
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
644 then translate the device and recurse. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
645 if (dst[slen - 1] == ':'
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
646 && dst[slen - 2] != ':' /* skip decnet nodes */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
647 && strcmp (src + slen, "[000000]") == 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
648 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
649 dst[slen - 1] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
650 if ((ptr = egetenv (dst))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
651 && (rlen = strlen (ptr) - 1) > 0
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
652 && (ptr[rlen] == ']' || ptr[rlen] == '>')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
653 && ptr[rlen - 1] == '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
654 {
1358
aa32c275cbf9 (directory_file_name): Don't clobber the envvar
Richard M. Stallman <rms@gnu.org>
parents: 1299
diff changeset
655 char * buf = (char *) alloca (strlen (ptr) + 1);
aa32c275cbf9 (directory_file_name): Don't clobber the envvar
Richard M. Stallman <rms@gnu.org>
parents: 1299
diff changeset
656 strcpy (buf, ptr);
aa32c275cbf9 (directory_file_name): Don't clobber the envvar
Richard M. Stallman <rms@gnu.org>
parents: 1299
diff changeset
657 buf[rlen - 1] = ']';
aa32c275cbf9 (directory_file_name): Don't clobber the envvar
Richard M. Stallman <rms@gnu.org>
parents: 1299
diff changeset
658 buf[rlen] = '\0';
aa32c275cbf9 (directory_file_name): Don't clobber the envvar
Richard M. Stallman <rms@gnu.org>
parents: 1299
diff changeset
659 return directory_file_name (buf, dst);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
660 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
661 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
662 dst[slen - 1] = ':';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
663 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
664 strcat (dst, "[000000]");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
665 slen += 8;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
666 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
667 rptr++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
668 rlen = strlen (rptr) - 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
669 strncat (dst, rptr, rlen);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
670 dst[slen + rlen] = '\0';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
671 strcat (dst, ".DIR.1");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
672 return 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
673 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
674 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
675 /* Process as Unix format: just remove any final slash.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
676 But leave "/" unchanged; do not change it to "". */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
677 strcpy (dst, src);
11667
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
678 #ifdef APOLLO
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
679 /* Handle // as root for apollo's. */
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
680 if ((slen > 2 && dst[slen - 1] == '/')
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
681 || (slen > 1 && dst[0] != '/' && dst[slen - 1] == '/'))
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
682 dst[slen - 1] = 0;
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
683 #else
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
684 if (slen > 1
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
685 && IS_DIRECTORY_SEP (dst[slen - 1])
12369
54271828fd4e (directory_file_name): Don't get confused by // at end on Unix-like systems.
Richard M. Stallman <rms@gnu.org>
parents: 11878
diff changeset
686 #ifdef DOS_NT
54271828fd4e (directory_file_name): Don't get confused by // at end on Unix-like systems.
Richard M. Stallman <rms@gnu.org>
parents: 11878
diff changeset
687 && !IS_ANY_SEP (dst[slen - 2])
54271828fd4e (directory_file_name): Don't get confused by // at end on Unix-like systems.
Richard M. Stallman <rms@gnu.org>
parents: 11878
diff changeset
688 #endif
54271828fd4e (directory_file_name): Don't get confused by // at end on Unix-like systems.
Richard M. Stallman <rms@gnu.org>
parents: 11878
diff changeset
689 )
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
690 dst[slen - 1] = 0;
11667
6945dfa38123 (directory_file_name): Add APOLLO conditional.
Richard M. Stallman <rms@gnu.org>
parents: 11658
diff changeset
691 #endif
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
692 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
693 CORRECT_DIR_SEPS (dst);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
694 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695 return 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
698 DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 1, 1, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
700 "Returns the file name of the directory named DIRECTORY.\n\
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
701 This is the name of the file that holds the data for the directory DIRECTORY.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
702 This operation exists because a directory is also a file, but its name as\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
703 a directory is different from its name as a file.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
704 In Unix-syntax, this function just removes the final slash.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
705 On VMS, given a VMS-syntax directory name such as \"[X.Y]\",\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
706 it returns a file name such as \"[X]Y.DIR.1\".")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
707 (directory)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
708 Lisp_Object directory;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
709 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
710 char *buf;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
711 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
712
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
713 CHECK_STRING (directory, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
714
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
715 if (NILP (directory))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
716 return Qnil;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
717
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
718 /* If the file name has special constructs in it,
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
719 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
720 handler = Ffind_file_name_handler (directory, Qdirectory_file_name);
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
721 if (!NILP (handler))
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
722 return call2 (handler, Qdirectory_file_name, directory);
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
723
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
724 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
725 /* 20 extra chars is insufficient for VMS, since we might perform a
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
726 logical name translation. an equivalence string can be up to 255
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
727 chars long, so grab that much extra space... - sss */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
728 buf = (char *) alloca (XSTRING (directory)->size + 20 + 255);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
729 #else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
730 buf = (char *) alloca (XSTRING (directory)->size + 20);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 directory_file_name (XSTRING (directory)->data, buf);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733 return build_string (buf);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
734 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
735
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
736 DEFUN ("make-temp-name", Fmake_temp_name, Smake_temp_name, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
737 "Generate temporary file name (string) starting with PREFIX (a string).\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
738 The Emacs process number forms part of the result,\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
739 so there is no danger of generating a name being used by another process.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
740 (prefix)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741 Lisp_Object prefix;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
743 Lisp_Object val;
14519
7efdb933356e (Fmake_temp_name) [MS-DOS]: Allow upto 8 characters in
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
744 #ifdef MSDOS
14571
1f051824c020 (Fmake_temp_name) [MSDOS]: Make sure there is at least
Karl Heuer <kwzh@gnu.org>
parents: 14519
diff changeset
745 /* Don't use too many characters of the restricted 8+3 DOS
14519
7efdb933356e (Fmake_temp_name) [MS-DOS]: Allow upto 8 characters in
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
746 filename space. */
14571
1f051824c020 (Fmake_temp_name) [MSDOS]: Make sure there is at least
Karl Heuer <kwzh@gnu.org>
parents: 14519
diff changeset
747 val = concat2 (prefix, build_string ("a.XXX"));
14519
7efdb933356e (Fmake_temp_name) [MS-DOS]: Allow upto 8 characters in
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
748 #else
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
749 val = concat2 (prefix, build_string ("XXXXXX"));
14519
7efdb933356e (Fmake_temp_name) [MS-DOS]: Allow upto 8 characters in
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
750 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 mktemp (XSTRING (val)->data);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
752 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
753 CORRECT_DIR_SEPS (XSTRING (val)->data);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
754 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
755 return val;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
756 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
757
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
758 DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
759 "Convert filename NAME to absolute, and canonicalize it.\n\
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
760 Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative\n\
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
761 (does not start with slash); if DEFAULT-DIRECTORY is nil or missing,\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
762 the current buffer's value of default-directory is used.\n\
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
763 File name components that are `.' are removed, and \n\
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
764 so are file name components followed by `..', along with the `..' itself;\n\
536
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
765 note that these simplifications are done without checking the resulting\n\
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
766 file names in the file system.\n\
536
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
767 An initial `~/' expands to your home directory.\n\
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
768 An initial `~USER/' expands to USER's home directory.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
769 See also the function `substitute-in-file-name'.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
770 (name, default_directory)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
771 Lisp_Object name, default_directory;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
772 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
773 unsigned char *nm;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
774
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
775 register unsigned char *newdir, *p, *o;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
776 int tlen;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
777 unsigned char *target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
778 struct passwd *pw;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
779 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
780 unsigned char * colon = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
781 unsigned char * close = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
782 unsigned char * slash = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
783 unsigned char * brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
784 int lbrack = 0, rbrack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
785 int dots = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
786 #endif /* VMS */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
787 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
788 int drive = 0;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
789 #endif /* DOS_NT */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
790 int length;
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
791 Lisp_Object handler;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
792
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
793 CHECK_STRING (name, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
794
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
795 /* If the file name has special constructs in it,
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
796 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
797 handler = Ffind_file_name_handler (name, Qexpand_file_name);
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
798 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
799 return call3 (handler, Qexpand_file_name, name, default_directory);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
800
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
801 /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted. */
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
802 if (NILP (default_directory))
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
803 default_directory = current_buffer->directory;
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
804 CHECK_STRING (default_directory, 1);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
805
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
806 if (!NILP (default_directory))
10719
40ae63b409f4 (Fexpand_file_name): Look for a handler for defalt.
Richard M. Stallman <rms@gnu.org>
parents: 10499
diff changeset
807 {
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
808 handler = Ffind_file_name_handler (default_directory, Qexpand_file_name);
10719
40ae63b409f4 (Fexpand_file_name): Look for a handler for defalt.
Richard M. Stallman <rms@gnu.org>
parents: 10499
diff changeset
809 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
810 return call3 (handler, Qexpand_file_name, name, default_directory);
10719
40ae63b409f4 (Fexpand_file_name): Look for a handler for defalt.
Richard M. Stallman <rms@gnu.org>
parents: 10499
diff changeset
811 }
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
812
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
813 o = XSTRING (default_directory)->data;
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
814
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
815 /* Make sure DEFAULT_DIRECTORY is properly expanded.
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
816 It would be better to do this down below where we actually use
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
817 default_directory. Unfortunately, calling Fexpand_file_name recursively
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
818 could invoke GC, and the strings might be relocated. This would
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
819 be annoying because we have pointers into strings lying around
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
820 that would need adjusting, and people would add new pointers to
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
821 the code and forget to adjust them, resulting in intermittent bugs.
2407
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
822 Putting this call here avoids all that crud.
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
823
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
824 The EQ test avoids infinite recursion. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
825 if (! NILP (default_directory) && !EQ (default_directory, name)
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
826 /* Save time in some common cases - as long as default_directory
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
827 is not relative, it can be canonicalized with name below (if it
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
828 is needed at all) without requiring it to be expanded now. */
14697
5a7714d4748e (Fexpand_file_name): Fix confusion in detecting
Richard M. Stallman <rms@gnu.org>
parents: 14616
diff changeset
829 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
830 /* Detect MSDOS file names with drive specifiers. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
831 && ! (IS_DRIVE (o[0]) && (IS_DEVICE_SEP (o[1]) && IS_DIRECTORY_SEP (o[2])))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
832 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
833 /* Detect Windows file names in UNC format. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
834 && ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
14697
5a7714d4748e (Fexpand_file_name): Fix confusion in detecting
Richard M. Stallman <rms@gnu.org>
parents: 14616
diff changeset
835 #endif
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
836 #else /* not DOS_NT */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
837 /* Detect Unix absolute file names (/... alone is not absolute on
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
838 DOS or Windows). */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
839 && ! (IS_DIRECTORY_SEP (o[0]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
840 #endif /* not DOS_NT */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
841 )
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
842 {
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
843 struct gcpro gcpro1;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
844
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
845 GCPRO1 (name);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
846 default_directory = Fexpand_file_name (default_directory, Qnil);
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
847 UNGCPRO;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
848 }
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
849
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
850 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
851 /* Filenames on VMS are always upper case. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852 name = Fupcase (name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
853 #endif
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
854 #ifdef FILE_SYSTEM_CASE
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
855 name = FILE_SYSTEM_CASE (name);
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
856 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
857
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
858 nm = XSTRING (name)->data;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
859
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
860 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
861 /* We will force directory separators to be either all \ or /, so make
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
862 a local copy to modify, even if there ends up being no change. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
863 nm = strcpy (alloca (strlen (nm) + 1), nm);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
864
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
865 /* Find and remove drive specifier if present; this makes nm absolute
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
866 even if the rest of the name appears to be relative. */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
867 {
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
868 unsigned char *colon = rindex (nm, ':');
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
869
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
870 if (colon)
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
871 /* Only recognize colon as part of drive specifier if there is a
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
872 single alphabetic character preceeding the colon (and if the
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
873 character before the drive letter, if present, is a directory
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
874 separator); this is to support the remote system syntax used by
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
875 ange-ftp, and the "po:username" syntax for POP mailboxes. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
876 look_again:
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
877 if (nm == colon)
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
878 nm++;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
879 else if (IS_DRIVE (colon[-1])
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
880 && (colon == nm + 1 || IS_DIRECTORY_SEP (colon[-2])))
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
881 {
11381
e5591c7b9e17 (directory_file_name) [WINDOWSNT]: Handle UNC format.
Karl Heuer <kwzh@gnu.org>
parents: 11235
diff changeset
882 drive = colon[-1];
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
883 nm = colon + 1;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
884 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
885 else
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
886 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
887 while (--colon >= nm)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
888 if (colon[0] == ':')
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
889 goto look_again;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
890 }
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
891 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
892 #endif /* DOS_NT */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
893
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
894 /* Handle // and /~ in middle of file name
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
895 by discarding everything through the first / of that sequence. */
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
896 p = nm;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
897 while (*p)
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
898 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
899 /* Since we are expecting the name to be absolute, we can assume
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
900 that each element starts with a "/". */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
901
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
902 if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1])
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
903 #if defined (APOLLO) || defined (WINDOWSNT)
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
904 /* // at start of filename is meaningful on Apollo
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
905 and WindowsNT systems */
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
906 && nm != p
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
907 #endif /* APOLLO || WINDOWSNT */
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
908 )
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
909 nm = p + 1;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
910
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
911 if (IS_DIRECTORY_SEP (p[0]) && p[1] == '~')
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
912 nm = p + 1;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
913
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
914 p++;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
915 }
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
916
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
917 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
918 /* Discard any previous drive specifier if nm is now in UNC format. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
919 if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
920 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
921 drive = 0;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
922 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
923 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
924
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
925 /* If nm is absolute, look for /./ or /../ sequences; if none are
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
926 found, we can probably return right away. We will avoid allocating
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
927 a new string if name is already fully expanded. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
928 if (
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
929 IS_DIRECTORY_SEP (nm[0])
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
930 #ifdef MSDOS
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
931 && drive
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
932 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
933 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
934 && (drive || IS_DIRECTORY_SEP (nm[1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
935 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
936 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
937 || index (nm, ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
938 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
939 )
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
940 {
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
941 /* If it turns out that the filename we want to return is just a
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
942 suffix of FILENAME, we don't need to go through and edit
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
943 things; we just need to construct a new string using data
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
944 starting at the middle of FILENAME. If we set lose to a
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
945 non-zero value, that means we've discovered that we can't do
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
946 that cool trick. */
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
947 int lose = 0;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
948
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
949 p = nm;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
950 while (*p)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
951 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
952 /* Since we know the name is absolute, we can assume that each
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
953 element starts with a "/". */
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
954
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
955 /* "." and ".." are hairy. */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
956 if (IS_DIRECTORY_SEP (p[0])
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
957 && p[1] == '.'
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
958 && (IS_DIRECTORY_SEP (p[2])
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
959 || p[2] == 0
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
960 || (p[2] == '.' && (IS_DIRECTORY_SEP (p[3])
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
961 || p[3] == 0))))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
962 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
963 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
964 if (p[0] == '\\')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
965 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
966 if (p[0] == '/') {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
967 /* if dev:[dir]/, move nm to / */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
968 if (!slash && p > nm && (brack || colon)) {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
969 nm = (brack ? brack + 1 : colon + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
970 lbrack = rbrack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
971 brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
972 colon = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
973 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
974 slash = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
975 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
976 if (p[0] == '-')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
977 #ifndef VMS4_4
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
978 /* VMS pre V4.4,convert '-'s in filenames. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
979 if (lbrack == rbrack)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
981 if (dots < 2) /* this is to allow negative version numbers */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
982 p[0] = '_';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 #endif /* VMS4_4 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 if (lbrack > rbrack &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 ((p[-1] == '.' || p[-1] == '[' || p[-1] == '<') &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
988 (p[1] == '.' || p[1] == ']' || p[1] == '>')))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
990 #ifndef VMS4_4
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992 p[0] = '_';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 #endif /* VMS4_4 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 /* count open brackets, reset close bracket pointer */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 if (p[0] == '[' || p[0] == '<')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
996 lbrack++, brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997 /* count close brackets, set close bracket pointer */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
998 if (p[0] == ']' || p[0] == '>')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
999 rbrack++, brack = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1000 /* detect ][ or >< */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1001 if ((p[0] == ']' || p[0] == '>') && (p[1] == '[' || p[1] == '<'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1002 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1003 if ((p[0] == ':' || p[0] == ']' || p[0] == '>') && p[1] == '~')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1004 nm = p + 1, lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1005 if (p[0] == ':' && (colon || slash))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1006 /* if dev1:[dir]dev2:, move nm to dev2: */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007 if (brack)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009 nm = brack + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1010 brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1011 }
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1012 /* if /name/dev:, move nm to dev: */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1013 else if (slash)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1014 nm = slash + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1015 /* if node::dev:, move colon following dev */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1016 else if (colon && colon[-1] == ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1017 colon = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1018 /* if dev1:dev2:, move nm to dev2: */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1019 else if (colon && colon[-1] != ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1020 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021 nm = colon + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 colon = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1024 if (p[0] == ':' && !colon)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1025 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1026 if (p[1] == ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1027 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1028 colon = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1029 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1030 if (lbrack == rbrack)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1031 if (p[0] == ';')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 dots = 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033 else if (p[0] == '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034 dots++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1036 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1038 if (!lose)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1039 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1040 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1041 if (index (nm, '/'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1042 return build_string (sys_translate_unix (nm));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1043 #endif /* VMS */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1044 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1045 /* Make sure directories are all separated with / or \ as
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1046 desired, but avoid allocation of a new string when not
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1047 required. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1048 CORRECT_DIR_SEPS (nm);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1049 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1050 if (IS_DIRECTORY_SEP (nm[1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1051 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1052 if (strcmp (nm, XSTRING (name)->data) != 0)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1053 name = build_string (nm);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1054 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1055 else
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1056 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1057 /* drive must be set, so this is okay */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1058 if (strcmp (nm - 2, XSTRING (name)->data) != 0)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1059 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1060 name = make_string (nm - 2, p - nm + 2);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1061 XSTRING (name)->data[0] = drive;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1062 XSTRING (name)->data[1] = ':';
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1063 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1064 return name;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1065 #else /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1066 if (nm == XSTRING (name)->data)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1067 return name;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1068 return build_string (nm);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1069 #endif /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1071 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1073 /* At this point, nm might or might not be an absolute file name. We
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1074 need to expand ~ or ~user if present, otherwise prefix nm with
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1075 default_directory if nm is not absolute, and finally collapse /./
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1076 and /foo/../ sequences.
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1077
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1078 We set newdir to be the appropriate prefix if one is needed:
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1079 - the relevant user directory if nm starts with ~ or ~user
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1080 - the specified drive's working dir (DOS/NT only) if nm does not
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1081 start with /
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1082 - the value of default_directory.
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1083
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1084 Note that these prefixes are not guaranteed to be absolute (except
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1085 for the working dir of a drive). Therefore, to ensure we always
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1086 return an absolute name, if the final prefix is not absolute we
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1087 append it to the current working directory. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1088
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1089 newdir = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1090
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1091 if (nm[0] == '~') /* prefix ~ */
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1092 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1093 if (IS_DIRECTORY_SEP (nm[1])
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1094 #ifdef VMS
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1095 || nm[1] == ':'
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1096 #endif /* VMS */
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1097 || nm[1] == 0) /* ~ by itself */
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1098 {
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1099 if (!(newdir = (unsigned char *) egetenv ("HOME")))
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1100 newdir = (unsigned char *) "";
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1101 nm++;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1102 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1103 if (IS_DIRECTORY_SEP (nm[0]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1104 /* Make nm look like a relative file name. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1105 nm++;
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1106 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1107 #ifdef VMS
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1108 nm++; /* Don't leave the slash in nm. */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1109 #endif /* VMS */
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1110 }
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1111 else /* ~user/filename */
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1112 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1113 for (p = nm; *p && (!IS_DIRECTORY_SEP (*p)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1114 #ifdef VMS
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1115 && *p != ':'
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1116 #endif /* VMS */
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1117 ); p++);
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1118 o = (unsigned char *) alloca (p - nm + 1);
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1119 bcopy ((char *) nm, o, p - nm);
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1120 o [p - nm] = 0;
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1121
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1122 pw = (struct passwd *) getpwnam (o + 1);
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1123 if (pw)
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1124 {
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1125 newdir = (unsigned char *) pw -> pw_dir;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1126 #ifdef VMS
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1127 nm = p + 1; /* skip the terminator */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1128 #else
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1129 nm = p;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1130 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1131 if (IS_DIRECTORY_SEP (nm[0]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1132 /* Make nm look like a relative name. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1133 nm++;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1134 #endif
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1135 #endif /* VMS */
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1136 }
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1137
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1138 /* If we don't find a user of that name, leave the name
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1139 unchanged; don't move nm forward to p. */
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1140 }
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1141 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1142
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1143 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1144 /* On DOS and Windows, nm is absolute if a drive name was specified;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1145 use the drive's current directory as the prefix if needed. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1146 if (!newdir && drive)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1147 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1148 /* Get default directory if needed to make nm absolute. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1149 if (!IS_DIRECTORY_SEP (nm[0]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1150 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1151 newdir = alloca (MAXPATHLEN + 1);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1152 if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1153 newdir = NULL;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1154 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1155 if (!newdir)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1156 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1157 /* Either nm starts with /, or drive isn't mounted. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1158 newdir = alloca (4);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1159 newdir[0] = drive;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1160 newdir[1] = ':';
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1161 newdir[2] = '/';
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1162 newdir[3] = 0;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1163 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1164 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1165 #endif /* DOS_NT */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1166
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1167 /* Finally, if no prefix has been specified and nm is not absolute,
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1168 then it must be expanded relative to default_directory. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1169
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1170 if (
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1171 #ifndef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1172 /* /... alone is not absolute on DOS and Windows. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1173 !IS_DIRECTORY_SEP (nm[0])
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1174 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1175 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1176 !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1177 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1178 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1179 && !index (nm, ':')
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1180 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1181 && !newdir)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1182 {
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1183 newdir = XSTRING (default_directory)->data;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1184 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1185
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1186 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1187 if (newdir)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1188 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1189 /* First ensure newdir is an absolute name. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1190 if (
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1191 /* Detect MSDOS file names with drive specifiers. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1192 ! (IS_DRIVE (newdir[0])
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1193 && IS_DEVICE_SEP (newdir[1]) && IS_DIRECTORY_SEP (newdir[2]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1194 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1195 /* Detect Windows file names in UNC format. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1196 && ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1197 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1198 )
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1199 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1200 /* Effectively, let newdir be (expand-file-name newdir cwd).
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1201 Because of the admonition against calling expand-file-name
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1202 when we have pointers into lisp strings, we accomplish this
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1203 indirectly by prepending newdir to nm if necessary, and using
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1204 cwd (or the wd of newdir's drive) as the new newdir. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1205
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1206 if (IS_DRIVE (newdir[0]) && newdir[1] == ':')
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1207 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1208 drive = newdir[0];
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1209 newdir += 2;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1210 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1211 if (!IS_DIRECTORY_SEP (nm[0]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1212 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1213 char * tmp = alloca (strlen (newdir) + strlen (nm) + 2);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1214 file_name_as_directory (tmp, newdir);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1215 strcat (tmp, nm);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1216 nm = tmp;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1217 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1218 newdir = alloca (MAXPATHLEN + 1);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1219 if (drive)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1220 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1221 if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1222 newdir = "/";
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1223 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1224 else
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1225 getwd (newdir);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1226 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1227
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1228 /* Strip off drive name from prefix, if present. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1229 if (IS_DRIVE (newdir[0]) && newdir[1] == ':')
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1230 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1231 drive = newdir[0];
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1232 newdir += 2;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1233 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1234
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1235 /* Keep only a prefix from newdir if nm starts with slash
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1236 (//server/share for UNC, nothing otherwise). */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1237 if (IS_DIRECTORY_SEP (nm[0]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1238 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1239 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1240 if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1241 {
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1242 newdir = strcpy (alloca (strlen (newdir) + 1), newdir);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1243 p = newdir + 2;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1244 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1245 p++;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1246 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1247 *p = 0;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1248 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1249 else
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1250 #endif
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1251 newdir = "";
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1252 }
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1253 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1254 #endif /* DOS_NT */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1255
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1256 if (newdir)
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1257 {
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1258 /* Get rid of any slash at the end of newdir. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1259 length = strlen (newdir);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1260 if (IS_DIRECTORY_SEP (newdir[length - 1]))
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1261 {
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1262 unsigned char *temp = (unsigned char *) alloca (length);
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1263 bcopy (newdir, temp, length - 1);
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1264 temp[length - 1] = 0;
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1265 newdir = temp;
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1266 }
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1267 tlen = length + 1;
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1268 }
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1269 else
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1270 tlen = 0;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1271
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1272 /* Now concatenate the directory and name to new space in the stack frame */
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 350
diff changeset
1273 tlen += strlen (nm) + 1;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1274 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1275 /* Add reserved space for drive name. (The Microsoft x86 compiler
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1276 produces incorrect code if the following two lines are combined.) */
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1277 target = (unsigned char *) alloca (tlen + 2);
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1278 target += 2;
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1279 #else /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1280 target = (unsigned char *) alloca (tlen);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1281 #endif /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1282 *target = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1283
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1284 if (newdir)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1285 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1286 #ifndef VMS
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1287 if (nm[0] == 0 || IS_DIRECTORY_SEP (nm[0]))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1288 strcpy (target, newdir);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1289 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1290 #endif
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1291 file_name_as_directory (target, newdir);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1292 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1293
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1294 strcat (target, nm);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1295 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1296 if (index (target, '/'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1297 strcpy (target, sys_translate_unix (target));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1298 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1299
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1300 /* ASSERT (IS_DIRECTORY_SEP (target[0])) if not VMS */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1301
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1302 /* Now canonicalize by removing /. and /foo/.. if they appear. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1303
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1304 p = target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1305 o = target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1306
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1307 while (*p)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1308 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1309 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1310 if (*p != ']' && *p != '>' && *p != '-')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1311 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1312 if (*p == '\\')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1313 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1314 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1315 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1316 else if ((p[0] == ']' || p[0] == '>') && p[0] == p[1] + 2)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1317 /* brackets are offset from each other by 2 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1318 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1319 p += 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1320 if (*p != '.' && *p != '-' && o[-1] != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1321 /* convert [foo][bar] to [bar] */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1322 while (o[-1] != '[' && o[-1] != '<')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1323 o--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1324 else if (*p == '-' && *o != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1325 *--p = '.';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1326 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1327 else if (p[0] == '-' && o[-1] == '.' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1328 (p[1] == '.' || p[1] == ']' || p[1] == '>'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1329 /* flush .foo.- ; leave - if stopped by '[' or '<' */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1330 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1331 do
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1332 o--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1333 while (o[-1] != '.' && o[-1] != '[' && o[-1] != '<');
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1334 if (p[1] == '.') /* foo.-.bar ==> bar. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1335 p += 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1336 else if (o[-1] == '.') /* '.foo.-]' ==> ']' */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1337 p++, o--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1338 /* else [foo.-] ==> [-] */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1339 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1340 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1341 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1342 #ifndef VMS4_4
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1343 if (*p == '-' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1344 o[-1] != '[' && o[-1] != '<' && o[-1] != '.' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1345 p[1] != ']' && p[1] != '>' && p[1] != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1346 *p = '_';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1347 #endif /* VMS4_4 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1348 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1349 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1350 #else /* not VMS */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1351 if (!IS_DIRECTORY_SEP (*p))
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1352 {
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1353 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1354 }
11426
6502c07121b7 (Fexpand_file_name): Use IS_DIRECTORY_SEP instead of
Karl Heuer <kwzh@gnu.org>
parents: 11392
diff changeset
1355 else if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1])
6502c07121b7 (Fexpand_file_name): Use IS_DIRECTORY_SEP instead of
Karl Heuer <kwzh@gnu.org>
parents: 11392
diff changeset
1356 #if defined (APOLLO) || defined (WINDOWSNT)
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1357 /* // at start of filename is meaningful in Apollo
11426
6502c07121b7 (Fexpand_file_name): Use IS_DIRECTORY_SEP instead of
Karl Heuer <kwzh@gnu.org>
parents: 11392
diff changeset
1358 and WindowsNT systems */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1359 && o != target
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1360 #endif /* APOLLO || WINDOWSNT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1361 )
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1362 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1363 o = target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1364 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1365 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1366 else if (IS_DIRECTORY_SEP (p[0])
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1367 && p[1] == '.'
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1368 && (IS_DIRECTORY_SEP (p[2])
1589
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1369 || p[2] == 0))
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1370 {
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1371 /* If "/." is the entire filename, keep the "/". Otherwise,
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1372 just delete the whole "/.". */
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1373 if (o == target && p[2] == '\0')
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1374 *o++ = *p;
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1375 p += 2;
6168f42d716c * fileio.c (Fexpand_file_name): Don't fiddle with "/." if it's the
Jim Blandy <jimb@redhat.com>
parents: 1536
diff changeset
1376 }
11426
6502c07121b7 (Fexpand_file_name): Use IS_DIRECTORY_SEP instead of
Karl Heuer <kwzh@gnu.org>
parents: 11392
diff changeset
1377 else if (IS_DIRECTORY_SEP (p[0]) && p[1] == '.' && p[2] == '.'
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1378 /* `/../' is the "superroot" on certain file systems. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1379 && o != target
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1380 && (IS_DIRECTORY_SEP (p[3]) || p[3] == 0))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1381 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1382 while (o != target && (--o) && !IS_DIRECTORY_SEP (*o))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1383 ;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1384 p += 3;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1385 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1386 else
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1387 {
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1388 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1389 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1390 #endif /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1391 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1392
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1393 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1394 /* At last, set drive name. */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1395 #ifdef WINDOWSNT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1396 /* Except for network file name. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1397 if (!(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1])))
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1398 #endif /* WINDOWSNT */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1399 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1400 if (!drive) abort ();
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1401 target -= 2;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1402 target[0] = drive;
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1403 target[1] = ':';
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1404 }
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1405 CORRECT_DIR_SEPS (target);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1406 #endif /* DOS_NT */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1407
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1408 return make_string (target, o - target);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1409 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1410
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1411 #if 0
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1412 /* Changed this DEFUN to a DEAFUN, so as not to confuse `make-docfile'. */
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
1413 DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1414 "Convert FILENAME to absolute, and canonicalize it.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1415 Second arg DEFAULT is directory to start with if FILENAME is relative\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1416 (does not start with slash); if DEFAULT is nil or missing,\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1417 the current buffer's value of default-directory is used.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1418 Filenames containing `.' or `..' as components are simplified;\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1419 initial `~/' expands to your home directory.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1420 See also the function `substitute-in-file-name'.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1421 (name, defalt)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1422 Lisp_Object name, defalt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1423 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1424 unsigned char *nm;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1425
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1426 register unsigned char *newdir, *p, *o;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1427 int tlen;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1428 unsigned char *target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1429 struct passwd *pw;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1430 int lose;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1431 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1432 unsigned char * colon = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1433 unsigned char * close = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1434 unsigned char * slash = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1435 unsigned char * brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1436 int lbrack = 0, rbrack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1437 int dots = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1438 #endif /* VMS */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1439
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1440 CHECK_STRING (name, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1441
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1442 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1443 /* Filenames on VMS are always upper case. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1444 name = Fupcase (name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1445 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1446
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1447 nm = XSTRING (name)->data;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1448
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1449 /* If nm is absolute, flush ...// and detect /./ and /../.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1450 If no /./ or /../ we can return right away. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1451 if (
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1452 nm[0] == '/'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1453 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1454 || index (nm, ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1455 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1456 )
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1457 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1458 p = nm;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1459 lose = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1460 while (*p)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1461 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1462 if (p[0] == '/' && p[1] == '/'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1463 #ifdef APOLLO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1464 /* // at start of filename is meaningful on Apollo system */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1465 && nm != p
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1466 #endif /* APOLLO */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1467 )
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1468 nm = p + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1469 if (p[0] == '/' && p[1] == '~')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1470 nm = p + 1, lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1471 if (p[0] == '/' && p[1] == '.'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1472 && (p[2] == '/' || p[2] == 0
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1473 || (p[2] == '.' && (p[3] == '/' || p[3] == 0))))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1474 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1475 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1476 if (p[0] == '\\')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1477 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1478 if (p[0] == '/') {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1479 /* if dev:[dir]/, move nm to / */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1480 if (!slash && p > nm && (brack || colon)) {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1481 nm = (brack ? brack + 1 : colon + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1482 lbrack = rbrack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1483 brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1484 colon = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1485 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1486 slash = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1487 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1488 if (p[0] == '-')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1489 #ifndef VMS4_4
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1490 /* VMS pre V4.4,convert '-'s in filenames. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1491 if (lbrack == rbrack)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1492 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1493 if (dots < 2) /* this is to allow negative version numbers */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1494 p[0] = '_';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1495 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1496 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1497 #endif /* VMS4_4 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1498 if (lbrack > rbrack &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1499 ((p[-1] == '.' || p[-1] == '[' || p[-1] == '<') &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1500 (p[1] == '.' || p[1] == ']' || p[1] == '>')))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1501 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1502 #ifndef VMS4_4
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1503 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1504 p[0] = '_';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1505 #endif /* VMS4_4 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1506 /* count open brackets, reset close bracket pointer */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1507 if (p[0] == '[' || p[0] == '<')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1508 lbrack++, brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1509 /* count close brackets, set close bracket pointer */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1510 if (p[0] == ']' || p[0] == '>')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1511 rbrack++, brack = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1512 /* detect ][ or >< */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1513 if ((p[0] == ']' || p[0] == '>') && (p[1] == '[' || p[1] == '<'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1514 lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1515 if ((p[0] == ':' || p[0] == ']' || p[0] == '>') && p[1] == '~')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1516 nm = p + 1, lose = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1517 if (p[0] == ':' && (colon || slash))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1518 /* if dev1:[dir]dev2:, move nm to dev2: */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1519 if (brack)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1520 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1521 nm = brack + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1522 brack = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1523 }
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1524 /* If /name/dev:, move nm to dev: */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1525 else if (slash)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1526 nm = slash + 1;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1527 /* If node::dev:, move colon following dev */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1528 else if (colon && colon[-1] == ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1529 colon = p;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1530 /* If dev1:dev2:, move nm to dev2: */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1531 else if (colon && colon[-1] != ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1532 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1533 nm = colon + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1534 colon = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1535 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1536 if (p[0] == ':' && !colon)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1537 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1538 if (p[1] == ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1539 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1540 colon = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1541 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1542 if (lbrack == rbrack)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1543 if (p[0] == ';')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1544 dots = 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1545 else if (p[0] == '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1546 dots++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1547 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1548 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1549 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1550 if (!lose)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1551 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1552 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1553 if (index (nm, '/'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1554 return build_string (sys_translate_unix (nm));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1555 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1556 if (nm == XSTRING (name)->data)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1557 return name;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1558 return build_string (nm);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1559 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1560 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1561
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1562 /* Now determine directory to start with and put it in NEWDIR */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1563
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1564 newdir = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1565
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1566 if (nm[0] == '~') /* prefix ~ */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1567 if (nm[1] == '/'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1568 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1569 || nm[1] == ':'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1570 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1571 || nm[1] == 0)/* ~/filename */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1572 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1573 if (!(newdir = (unsigned char *) egetenv ("HOME")))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1574 newdir = (unsigned char *) "";
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1575 nm++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1576 #ifdef VMS
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1577 nm++; /* Don't leave the slash in nm. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1578 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1579 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1580 else /* ~user/filename */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1581 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1582 /* Get past ~ to user */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1583 unsigned char *user = nm + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1584 /* Find end of name. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1585 unsigned char *ptr = (unsigned char *) index (user, '/');
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1586 int len = ptr ? ptr - user : strlen (user);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1587 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1588 unsigned char *ptr1 = index (user, ':');
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1589 if (ptr1 != 0 && ptr1 - user < len)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1590 len = ptr1 - user;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1591 #endif /* VMS */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1592 /* Copy the user name into temp storage. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1593 o = (unsigned char *) alloca (len + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1594 bcopy ((char *) user, o, len);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1595 o[len] = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1596
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1597 /* Look up the user name. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1598 pw = (struct passwd *) getpwnam (o + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1599 if (!pw)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1600 error ("\"%s\" isn't a registered user", o + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1601
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1602 newdir = (unsigned char *) pw->pw_dir;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1603
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1604 /* Discard the user name from NM. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1605 nm += len;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1606 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1607
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1608 if (nm[0] != '/'
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1609 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1610 && !index (nm, ':')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1611 #endif /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1612 && !newdir)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1613 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
1614 if (NILP (defalt))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1615 defalt = current_buffer->directory;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1616 CHECK_STRING (defalt, 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1617 newdir = XSTRING (defalt)->data;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1618 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1619
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1620 /* Now concatenate the directory and name to new space in the stack frame */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1621
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1622 tlen = (newdir ? strlen (newdir) + 1 : 0) + strlen (nm) + 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1623 target = (unsigned char *) alloca (tlen);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1624 *target = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1625
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1626 if (newdir)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1627 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1628 #ifndef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1629 if (nm[0] == 0 || nm[0] == '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1630 strcpy (target, newdir);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1631 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1632 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1633 file_name_as_directory (target, newdir);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1634 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1635
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1636 strcat (target, nm);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1637 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1638 if (index (target, '/'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1639 strcpy (target, sys_translate_unix (target));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1640 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1641
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1642 /* Now canonicalize by removing /. and /foo/.. if they appear */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1643
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1644 p = target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1645 o = target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1646
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1647 while (*p)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1648 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1649 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1650 if (*p != ']' && *p != '>' && *p != '-')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1651 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1652 if (*p == '\\')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1653 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1654 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1655 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1656 else if ((p[0] == ']' || p[0] == '>') && p[0] == p[1] + 2)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1657 /* brackets are offset from each other by 2 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1658 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1659 p += 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1660 if (*p != '.' && *p != '-' && o[-1] != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1661 /* convert [foo][bar] to [bar] */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1662 while (o[-1] != '[' && o[-1] != '<')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1663 o--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1664 else if (*p == '-' && *o != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1665 *--p = '.';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1666 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1667 else if (p[0] == '-' && o[-1] == '.' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1668 (p[1] == '.' || p[1] == ']' || p[1] == '>'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1669 /* flush .foo.- ; leave - if stopped by '[' or '<' */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1670 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1671 do
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1672 o--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1673 while (o[-1] != '.' && o[-1] != '[' && o[-1] != '<');
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1674 if (p[1] == '.') /* foo.-.bar ==> bar. */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1675 p += 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1676 else if (o[-1] == '.') /* '.foo.-]' ==> ']' */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1677 p++, o--;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1678 /* else [foo.-] ==> [-] */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1679 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1680 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1681 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1682 #ifndef VMS4_4
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1683 if (*p == '-' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1684 o[-1] != '[' && o[-1] != '<' && o[-1] != '.' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1685 p[1] != ']' && p[1] != '>' && p[1] != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1686 *p = '_';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1687 #endif /* VMS4_4 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1688 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1689 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1690 #else /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1691 if (*p != '/')
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1692 {
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1693 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1694 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1695 else if (!strncmp (p, "//", 2)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1696 #ifdef APOLLO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1697 /* // at start of filename is meaningful in Apollo system */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1698 && o != target
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1699 #endif /* APOLLO */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1700 )
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1701 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1702 o = target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1703 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1704 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1705 else if (p[0] == '/' && p[1] == '.' &&
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1706 (p[2] == '/' || p[2] == 0))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1707 p += 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1708 else if (!strncmp (p, "/..", 3)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1709 /* `/../' is the "superroot" on certain file systems. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1710 && o != target
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1711 && (p[3] == '/' || p[3] == 0))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1712 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1713 while (o != target && *--o != '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1714 ;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1715 #ifdef APOLLO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1716 if (o == target + 1 && o[-1] == '/' && o[0] == '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1717 ++o;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1718 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1719 #endif /* APOLLO */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1720 if (o == target && *o == '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1721 ++o;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1722 p += 3;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1723 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1724 else
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1725 {
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1726 *o++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1727 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1728 #endif /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1729 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1730
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1731 return make_string (target, o - target);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1732 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1733 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1734
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1735 DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1736 Ssubstitute_in_file_name, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1737 "Substitute environment variables referred to in FILENAME.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1738 `$FOO' where FOO is an environment variable name means to substitute\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1739 the value of that variable. The variable name should be terminated\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1740 with a character not a letter, digit or underscore; otherwise, enclose\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1741 the entire variable name in braces.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1742 If `/~' appears, all of FILENAME through that `/' is discarded.\n\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1743 On VMS, `$' substitution is not done; this function does little and only\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1744 duplicates what `expand-file-name' does.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1745 (filename)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1746 Lisp_Object filename;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1747 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1748 unsigned char *nm;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1749
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1750 register unsigned char *s, *p, *o, *x, *endp;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1751 unsigned char *target;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1752 int total = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1753 int substituted = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1754 unsigned char *xnm;
9955
dfb5d7e86733 (Fread_file_name_internal): Protect orig_string.
Richard M. Stallman <rms@gnu.org>
parents: 9921
diff changeset
1755 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1756
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1757 CHECK_STRING (filename, 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1758
9955
dfb5d7e86733 (Fread_file_name_internal): Protect orig_string.
Richard M. Stallman <rms@gnu.org>
parents: 9921
diff changeset
1759 /* If the file name has special constructs in it,
dfb5d7e86733 (Fread_file_name_internal): Protect orig_string.
Richard M. Stallman <rms@gnu.org>
parents: 9921
diff changeset
1760 call the corresponding file handler. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1761 handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
9955
dfb5d7e86733 (Fread_file_name_internal): Protect orig_string.
Richard M. Stallman <rms@gnu.org>
parents: 9921
diff changeset
1762 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1763 return call2 (handler, Qsubstitute_in_file_name, filename);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1764
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1765 nm = XSTRING (filename)->data;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1766 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1767 nm = strcpy (alloca (strlen (nm) + 1), nm);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1768 CORRECT_DIR_SEPS (nm);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1769 substituted = (strcmp (nm, XSTRING (filename)->data) != 0);
8185
b5cc015a3698 (Ffile_name_directory, Ffile_name_nondirectory,
Richard M. Stallman <rms@gnu.org>
parents: 8079
diff changeset
1770 #endif
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1771 endp = nm + XSTRING (filename)->size;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1772
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1773 /* If /~ or // appears, discard everything through first slash. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1774
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1775 for (p = nm; p != endp; p++)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1776 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1777 if ((p[0] == '~'
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1778 #if defined (APOLLO) || defined (WINDOWSNT)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1779 /* // at start of file name is meaningful in Apollo and
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1780 WindowsNT systems */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1781 || (IS_DIRECTORY_SEP (p[0]) && p - 1 != nm)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1782 #else /* not (APOLLO || WINDOWSNT) */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1783 || IS_DIRECTORY_SEP (p[0])
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1784 #endif /* not (APOLLO || WINDOWSNT) */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1785 )
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1786 && p != nm
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1787 && (0
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1788 #ifdef VMS
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1789 || p[-1] == ':' || p[-1] == ']' || p[-1] == '>'
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1790 #endif /* VMS */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1791 || IS_DIRECTORY_SEP (p[-1])))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1792 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1793 nm = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1794 substituted = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1795 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1796 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1797 /* see comment in expand-file-name about drive specifiers */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1798 else if (IS_DRIVE (p[0]) && p[1] == ':'
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1799 && p > nm && IS_DIRECTORY_SEP (p[-1]))
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1800 {
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1801 nm = p;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1802 substituted = 1;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1803 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1804 #endif /* DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1805 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1806
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1807 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1808 return build_string (nm);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1809 #else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1810
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1811 /* See if any variables are substituted into the string
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1812 and find the total length of their values in `total' */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1813
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1814 for (p = nm; p != endp;)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1815 if (*p != '$')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1816 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1817 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1818 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1819 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1820 if (p == endp)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1821 goto badsubst;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1822 else if (*p == '$')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1823 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1824 /* "$$" means a single "$" */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1825 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1826 total -= 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1827 substituted = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1828 continue;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1829 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1830 else if (*p == '{')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1831 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1832 o = ++p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1833 while (p != endp && *p != '}') p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1834 if (*p != '}') goto missingclose;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1835 s = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1836 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1837 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1838 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1839 o = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1840 while (p != endp && (isalnum (*p) || *p == '_')) p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1841 s = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1842 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1843
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1844 /* Copy out the variable name */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1845 target = (unsigned char *) alloca (s - o + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1846 strncpy (target, o, s - o);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1847 target[s - o] = 0;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1848 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1849 strupr (target); /* $home == $HOME etc. */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1850 #endif /* DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1851
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1852 /* Get variable value */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1853 o = (unsigned char *) egetenv (target);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1854 if (!o) goto badvar;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1855 total += strlen (o);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1856 substituted = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1857 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1858
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1859 if (!substituted)
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1860 return filename;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1861
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1862 /* If substitution required, recopy the string and do it */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1863 /* Make space in stack frame for the new copy */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1864 xnm = (unsigned char *) alloca (XSTRING (filename)->size + total + 1);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1865 x = xnm;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1866
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1867 /* Copy the rest of the name through, replacing $ constructs with values */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1868 for (p = nm; *p;)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1869 if (*p != '$')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1870 *x++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1871 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1872 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1873 p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1874 if (p == endp)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1875 goto badsubst;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1876 else if (*p == '$')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1877 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1878 *x++ = *p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1879 continue;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1880 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1881 else if (*p == '{')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1882 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1883 o = ++p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1884 while (p != endp && *p != '}') p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1885 if (*p != '}') goto missingclose;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1886 s = p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1887 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1888 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1889 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1890 o = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1891 while (p != endp && (isalnum (*p) || *p == '_')) p++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1892 s = p;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1893 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1894
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1895 /* Copy out the variable name */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1896 target = (unsigned char *) alloca (s - o + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1897 strncpy (target, o, s - o);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1898 target[s - o] = 0;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1899 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1900 strupr (target); /* $home == $HOME etc. */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1901 #endif /* DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1902
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1903 /* Get variable value */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1904 o = (unsigned char *) egetenv (target);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1905 if (!o)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1906 goto badvar;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1907
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1908 strcpy (x, o);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1909 x += strlen (o);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1910 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1911
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1912 *x = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1913
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1914 /* If /~ or // appears, discard everything through first slash. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1915
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1916 for (p = xnm; p != x; p++)
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1917 if ((p[0] == '~'
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1918 #if defined (APOLLO) || defined (WINDOWSNT)
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1919 || (IS_DIRECTORY_SEP (p[0]) && p - 1 != xnm)
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1920 #else /* not (APOLLO || WINDOWSNT) */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1921 || IS_DIRECTORY_SEP (p[0])
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1922 #endif /* not (APOLLO || WINDOWSNT) */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1923 )
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1924 && p != nm && IS_DIRECTORY_SEP (p[-1]))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1925 xnm = p;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
1926 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1927 else if (IS_DRIVE (p[0]) && p[1] == ':'
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1928 && p > nm && IS_DIRECTORY_SEP (p[-1]))
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1929 xnm = p;
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
1930 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1931
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1932 return make_string (xnm, x - xnm);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1933
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1934 badsubst:
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1935 error ("Bad format environment-variable substitution");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1936 missingclose:
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1937 error ("Missing \"}\" in environment-variable substitution");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1938 badvar:
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1939 error ("Substituting nonexistent environment variable \"%s\"", target);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1940
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1941 /* NOTREACHED */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1942 #endif /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1943 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1944
853
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 850
diff changeset
1945 /* A slightly faster and more convenient way to get
4451
73b91cd2c55e (expand_and_dir_to_file): Remove final / by copying abspath.
Richard M. Stallman <rms@gnu.org>
parents: 4395
diff changeset
1946 (directory-file-name (expand-file-name FOO)). */
853
224b0d5d1a38 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 850
diff changeset
1947
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1948 Lisp_Object
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1949 expand_and_dir_to_file (filename, defdir)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1950 Lisp_Object filename, defdir;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1951 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1952 register Lisp_Object absname;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1953
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1954 absname = Fexpand_file_name (filename, defdir);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1955 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1956 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1957 register int c = XSTRING (absname)->data[XSTRING (absname)->size - 1];
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1958 if (c == ':' || c == ']' || c == '>')
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1959 absname = Fdirectory_file_name (absname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1960 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1961 #else
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1962 /* Remove final slash, if any (unless this is the root dir).
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1963 stat behaves differently depending! */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1964 if (XSTRING (absname)->size > 1
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1965 && IS_DIRECTORY_SEP (XSTRING (absname)->data[XSTRING (absname)->size - 1])
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1966 && !IS_DEVICE_SEP (XSTRING (absname)->data[XSTRING (absname)->size-2]))
4483
6894dd27c9ec (expand_and_dir_to_file): Use Fdirectory_file_name.
Richard M. Stallman <rms@gnu.org>
parents: 4451
diff changeset
1967 /* We cannot take shortcuts; they might be wrong for magic file names. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1968 absname = Fdirectory_file_name (absname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1969 #endif
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
1970 return absname;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1971 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1972
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1973 /* Signal an error if the file ABSNAME already exists.
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1974 If INTERACTIVE is nonzero, ask the user whether to proceed,
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1975 and bypass the error if the user says to go ahead.
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1976 QUERYSTRING is a name for the action that is being considered
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1977 to alter the file.
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1978 *STATPTR is used to store the stat information if the file exists.
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1979 If the file does not exist, STATPTR->st_mode is set to 0. */
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1980
8846
6bf0ce964319 (barf_or_query_if_file_exists): Fix declaration.
Karl Heuer <kwzh@gnu.org>
parents: 8808
diff changeset
1981 void
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1982 barf_or_query_if_file_exists (absname, querystring, interactive, statptr)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1983 Lisp_Object absname;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1984 unsigned char *querystring;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1985 int interactive;
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
1986 struct stat *statptr;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1987 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1988 register Lisp_Object tem;
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
1989 struct stat statbuf;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1990 struct gcpro gcpro1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1991
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
1992 /* stat is a good way to tell whether the file exists,
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
1993 regardless of what access permissions it has. */
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
1994 if (stat (XSTRING (absname)->data, &statbuf) >= 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1995 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1996 if (! interactive)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1997 Fsignal (Qfile_already_exists,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1998 Fcons (build_string ("File already exists"),
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1999 Fcons (absname, Qnil)));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2000 GCPRO1 (absname);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2001 tem = do_yes_or_no_p (format1 ("File %s already exists; %s anyway? ",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2002 XSTRING (absname)->data, querystring));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2003 UNGCPRO;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2004 if (NILP (tem))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2005 Fsignal (Qfile_already_exists,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2006 Fcons (build_string ("File already exists"),
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2007 Fcons (absname, Qnil)));
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2008 if (statptr)
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2009 *statptr = statbuf;
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2010 }
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2011 else
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2012 {
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2013 if (statptr)
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2014 statptr->st_mode = 0;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2015 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2016 return;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2017 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2018
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2019 DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 4,
410
7812e9efc1af *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
2020 "fCopy file: \nFCopy %s to file: \np\nP",
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2021 "Copy FILE to NEWNAME. Both args must be strings.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2022 Signals a `file-already-exists' error if file NEWNAME already exists,\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2023 unless a third argument OK-IF-ALREADY-EXISTS is supplied and non-nil.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2024 A number as third arg means request confirmation if NEWNAME already exists.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2025 This is what happens in interactive use with M-x.\n\
410
7812e9efc1af *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
2026 Fourth arg KEEP-TIME non-nil means give the new file the same\n\
7812e9efc1af *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
2027 last-modified time as the old one. (This works on only some systems.)\n\
7812e9efc1af *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
2028 A prefix arg makes KEEP-TIME non-nil.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2029 (file, newname, ok_if_already_exists, keep_date)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2030 Lisp_Object file, newname, ok_if_already_exists, keep_date;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2031 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2032 int ifd, ofd, n;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2033 char buf[16 * 1024];
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2034 struct stat st, out_st;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2035 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2036 struct gcpro gcpro1, gcpro2;
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2037 int count = specpdl_ptr - specpdl;
4879
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2038 int input_file_statable_p;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2039
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2040 GCPRO2 (file, newname);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2041 CHECK_STRING (file, 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2042 CHECK_STRING (newname, 1);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2043 file = Fexpand_file_name (file, Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2044 newname = Fexpand_file_name (newname, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2045
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
2046 /* If the input file name has special constructs in it,
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2047 call the corresponding file handler. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2048 handler = Ffind_file_name_handler (file, Qcopy_file);
3705
309c27256ceb (Fcopy_file): Pass all the args to the handler.
Richard M. Stallman <rms@gnu.org>
parents: 3598
diff changeset
2049 /* Likewise for output file name. */
309c27256ceb (Fcopy_file): Pass all the args to the handler.
Richard M. Stallman <rms@gnu.org>
parents: 3598
diff changeset
2050 if (NILP (handler))
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2051 handler = Ffind_file_name_handler (newname, Qcopy_file);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2052 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2053 RETURN_UNGCPRO (call5 (handler, Qcopy_file, file, newname,
6370
51a014b7c656 (Frename_file, Fcopy_file, Fadd_name_to_file, Fmake_symbolic_link): Fix typo
Karl Heuer <kwzh@gnu.org>
parents: 6367
diff changeset
2054 ok_if_already_exists, keep_date));
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2055
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2056 if (NILP (ok_if_already_exists)
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
2057 || INTEGERP (ok_if_already_exists))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2058 barf_or_query_if_file_exists (newname, "copy to it",
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2059 INTEGERP (ok_if_already_exists), &out_st);
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2060 else if (stat (XSTRING (newname)->data, &out_st) < 0)
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2061 out_st.st_mode = 0;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2062
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2063 ifd = open (XSTRING (file)->data, O_RDONLY);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2064 if (ifd < 0)
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2065 report_file_error ("Opening input file", Fcons (file, Qnil));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2066
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2067 record_unwind_protect (close_file_unwind, make_number (ifd));
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2068
4879
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2069 /* We can only copy regular files and symbolic links. Other files are not
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2070 copyable by us. */
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2071 input_file_statable_p = (fstat (ifd, &st) >= 0);
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2072
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2073 #ifndef MSDOS
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2074 if (out_st.st_mode != 0
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2075 && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2076 {
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2077 errno = 0;
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2078 report_file_error ("Input and output files are the same",
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2079 Fcons (file, Fcons (newname, Qnil)));
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2080 }
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2081 #endif
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2082
4879
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2083 #if defined (S_ISREG) && defined (S_ISLNK)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2084 if (input_file_statable_p)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2085 {
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2086 if (!(S_ISREG (st.st_mode)) && !(S_ISLNK (st.st_mode)))
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2087 {
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2088 #if defined (EISDIR)
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2089 /* Get a better looking error message. */
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2090 errno = EISDIR;
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2091 #endif /* EISDIR */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2092 report_file_error ("Non-regular file", Fcons (file, Qnil));
4879
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2093 }
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2094 }
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2095 #endif /* S_ISREG && S_ISLNK */
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2096
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2097 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2098 /* Create the copy file with the same record format as the input file */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2099 ofd = sys_creat (XSTRING (newname)->data, 0666, ifd);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2100 #else
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2101 #ifdef MSDOS
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2102 /* System's default file type was set to binary by _fmode in emacs.c. */
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2103 ofd = creat (XSTRING (newname)->data, S_IREAD | S_IWRITE);
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2104 #else /* not MSDOS */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2105 ofd = creat (XSTRING (newname)->data, 0666);
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2106 #endif /* not MSDOS */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2107 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2108 if (ofd < 0)
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2109 report_file_error ("Opening output file", Fcons (newname, Qnil));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2110
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2111 record_unwind_protect (close_file_unwind, make_number (ofd));
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2112
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2113 immediate_quit = 1;
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2114 QUIT;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2115 while ((n = read (ifd, buf, sizeof buf)) > 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2116 if (write (ofd, buf, n) != n)
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2117 report_file_error ("I/O error", Fcons (newname, Qnil));
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2118 immediate_quit = 0;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2119
7493
f4fb8b913c5d (Fcopy_file): Close output before setting its times.
Richard M. Stallman <rms@gnu.org>
parents: 7445
diff changeset
2120 /* Closing the output clobbers the file times on some systems. */
f4fb8b913c5d (Fcopy_file): Close output before setting its times.
Richard M. Stallman <rms@gnu.org>
parents: 7445
diff changeset
2121 if (close (ofd) < 0)
f4fb8b913c5d (Fcopy_file): Close output before setting its times.
Richard M. Stallman <rms@gnu.org>
parents: 7445
diff changeset
2122 report_file_error ("I/O error", Fcons (newname, Qnil));
f4fb8b913c5d (Fcopy_file): Close output before setting its times.
Richard M. Stallman <rms@gnu.org>
parents: 7445
diff changeset
2123
4879
1774c84aca2e (Fcopy_file): Don't allow the copying of anything other than regular
Brian Fox <bfox@gnu.org>
parents: 4853
diff changeset
2124 if (input_file_statable_p)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2125 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2126 if (!NILP (keep_date))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2127 {
564
d909f2be7ee1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 550
diff changeset
2128 EMACS_TIME atime, mtime;
d909f2be7ee1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 550
diff changeset
2129 EMACS_SET_SECS_USECS (atime, st.st_atime, 0);
d909f2be7ee1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 550
diff changeset
2130 EMACS_SET_SECS_USECS (mtime, st.st_mtime, 0);
8883
24993c71127a (Fcopy_file): Use set_file_times, and check for the error return.
Karl Heuer <kwzh@gnu.org>
parents: 8846
diff changeset
2131 if (set_file_times (XSTRING (newname)->data, atime, mtime))
24993c71127a (Fcopy_file): Use set_file_times, and check for the error return.
Karl Heuer <kwzh@gnu.org>
parents: 8846
diff changeset
2132 report_file_error ("I/O error", Fcons (newname, Qnil));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2133 }
13541
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2134 #ifndef MSDOS
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2135 chmod (XSTRING (newname)->data, st.st_mode & 07777);
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2136 #else /* MSDOS */
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2137 #if defined (__DJGPP__) && __DJGPP__ > 1
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2138 /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2139 and if it can't, it tells so. Otherwise, under MSDOS we usually
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2140 get only the READ bit, which will make the copied file read-only,
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2141 so it's better not to chmod at all. */
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2142 if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
564
d909f2be7ee1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 550
diff changeset
2143 chmod (XSTRING (newname)->data, st.st_mode & 07777);
13541
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2144 #endif /* DJGPP version 2 or newer */
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2145 #endif /* MSDOS */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2146 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2147
7493
f4fb8b913c5d (Fcopy_file): Close output before setting its times.
Richard M. Stallman <rms@gnu.org>
parents: 7445
diff changeset
2148 close (ifd);
f4fb8b913c5d (Fcopy_file): Close output before setting its times.
Richard M. Stallman <rms@gnu.org>
parents: 7445
diff changeset
2149
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2150 /* Discard the unwind protects. */
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2151 specpdl_ptr = specpdl + count;
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
2152
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2153 UNGCPRO;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2154 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2155 }
10084
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2156
1533
b86ef0432100 (Fmake_directory_internal): Renamed from Fmake_directory.
Richard M. Stallman <rms@gnu.org>
parents: 1377
diff changeset
2157 DEFUN ("make-directory-internal", Fmake_directory_internal,
1536
0877009e6324 * fileio.c (Fmake_directory_internal): Remove extra paren before the
Jim Blandy <jimb@redhat.com>
parents: 1533
diff changeset
2158 Smake_directory_internal, 1, 1, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2159 "Create a new directory named DIRECTORY.")
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2160 (directory)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2161 Lisp_Object directory;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2162 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2163 unsigned char *dir;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2164 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2165
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2166 CHECK_STRING (directory, 0);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2167 directory = Fexpand_file_name (directory, Qnil);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2168
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2169 handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2170 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2171 return call2 (handler, Qmake_directory_internal, directory);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2172
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2173 dir = XSTRING (directory)->data;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2174
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2175 #ifdef WINDOWSNT
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2176 if (mkdir (dir) != 0)
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2177 #else
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2178 if (mkdir (dir, 0777) != 0)
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2179 #endif
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2180 report_file_error ("Creating directory", Flist (1, &directory));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2181
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2182 return Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2183 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2184
686
bd3068742807 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 648
diff changeset
2185 DEFUN ("delete-directory", Fdelete_directory, Sdelete_directory, 1, 1, "FDelete directory: ",
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2186 "Delete the directory named DIRECTORY.")
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2187 (directory)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2188 Lisp_Object directory;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2189 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2190 unsigned char *dir;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2191 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2192
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2193 CHECK_STRING (directory, 0);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2194 directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil));
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2195 dir = XSTRING (directory)->data;
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2196
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2197 handler = Ffind_file_name_handler (directory, Qdelete_directory);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2198 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2199 return call2 (handler, Qdelete_directory, directory);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2200
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2201 if (rmdir (dir) != 0)
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2202 report_file_error ("Removing directory", Flist (1, &directory));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2203
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2204 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2205 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2206
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2207 DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 1, "fDelete file: ",
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2208 "Delete file named FILENAME.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2209 If file has multiple names, it continues to exist with the other names.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2210 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2211 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2212 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2213 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2214 CHECK_STRING (filename, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2215 filename = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2216
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2217 handler = Ffind_file_name_handler (filename, Qdelete_file);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2218 if (!NILP (handler))
9170
1d95c81487a3 (Fdelete_file): Undo Sep 16 change.
Karl Heuer <kwzh@gnu.org>
parents: 9131
diff changeset
2219 return call2 (handler, Qdelete_file, filename);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2220
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2221 if (0 > unlink (XSTRING (filename)->data))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2222 report_file_error ("Removing old name", Flist (1, &filename));
9170
1d95c81487a3 (Fdelete_file): Undo Sep 16 change.
Karl Heuer <kwzh@gnu.org>
parents: 9131
diff changeset
2223 return Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2224 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2225
10084
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2226 static Lisp_Object
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2227 internal_delete_file_1 (ignore)
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2228 Lisp_Object ignore;
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2229 {
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2230 return Qt;
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2231 }
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2232
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2233 /* Delete file FILENAME, returning 1 if successful and 0 if failed. */
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2234
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2235 int
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2236 internal_delete_file (filename)
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2237 Lisp_Object filename;
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2238 {
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2239 return NILP (internal_condition_case_1 (Fdelete_file, filename,
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2240 Qt, internal_delete_file_1));
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2241 }
e930bf84753c (internal_delete_file, internal_delete_file_1): New functions.
Richard M. Stallman <rms@gnu.org>
parents: 9962
diff changeset
2242
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2243 DEFUN ("rename-file", Frename_file, Srename_file, 2, 3,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2244 "fRename file: \nFRename %s to file: \np",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2245 "Rename FILE as NEWNAME. Both args strings.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2246 If file has names other than FILE, it continues to have those names.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2247 Signals a `file-already-exists' error if a file NEWNAME already exists\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2248 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2249 A number as third arg means request confirmation if NEWNAME already exists.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2250 This is what happens in interactive use with M-x.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2251 (file, newname, ok_if_already_exists)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2252 Lisp_Object file, newname, ok_if_already_exists;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2253 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2254 #ifdef NO_ARG_ARRAY
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2255 Lisp_Object args[2];
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2256 #endif
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2257 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2258 struct gcpro gcpro1, gcpro2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2259
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2260 GCPRO2 (file, newname);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2261 CHECK_STRING (file, 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2262 CHECK_STRING (newname, 1);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2263 file = Fexpand_file_name (file, Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2264 newname = Fexpand_file_name (newname, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2265
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2266 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2267 call the corresponding file handler. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2268 handler = Ffind_file_name_handler (file, Qrename_file);
3705
309c27256ceb (Fcopy_file): Pass all the args to the handler.
Richard M. Stallman <rms@gnu.org>
parents: 3598
diff changeset
2269 if (NILP (handler))
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2270 handler = Ffind_file_name_handler (newname, Qrename_file);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2271 if (!NILP (handler))
6370
51a014b7c656 (Frename_file, Fcopy_file, Fadd_name_to_file, Fmake_symbolic_link): Fix typo
Karl Heuer <kwzh@gnu.org>
parents: 6367
diff changeset
2272 RETURN_UNGCPRO (call4 (handler, Qrename_file,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2273 file, newname, ok_if_already_exists));
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2274
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2275 if (NILP (ok_if_already_exists)
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
2276 || INTEGERP (ok_if_already_exists))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2277 barf_or_query_if_file_exists (newname, "rename to it",
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2278 INTEGERP (ok_if_already_exists), 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2279 #ifndef BSD4_1
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2280 if (0 > rename (XSTRING (file)->data, XSTRING (newname)->data))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2281 #else
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2282 if (0 > link (XSTRING (file)->data, XSTRING (newname)->data)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2283 || 0 > unlink (XSTRING (file)->data))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2284 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2285 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2286 if (errno == EXDEV)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2287 {
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2288 Fcopy_file (file, newname,
3963
39caef7a70c2 (Frename_file): After prompting for ok-if-already-exists, pass only nil or
Roland McGrath <roland@gnu.org>
parents: 3829
diff changeset
2289 /* We have already prompted if it was an integer,
39caef7a70c2 (Frename_file): After prompting for ok-if-already-exists, pass only nil or
Roland McGrath <roland@gnu.org>
parents: 3829
diff changeset
2290 so don't have copy-file prompt again. */
39caef7a70c2 (Frename_file): After prompting for ok-if-already-exists, pass only nil or
Roland McGrath <roland@gnu.org>
parents: 3829
diff changeset
2291 NILP (ok_if_already_exists) ? Qnil : Qt, Qt);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2292 Fdelete_file (file);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2293 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2294 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2295 #ifdef NO_ARG_ARRAY
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2296 {
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2297 args[0] = file;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2298 args[1] = newname;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2299 report_file_error ("Renaming", Flist (2, args));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2300 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2301 #else
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2302 report_file_error ("Renaming", Flist (2, &file));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2303 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2304 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2305 UNGCPRO;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2306 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2307 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2308
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2309 DEFUN ("add-name-to-file", Fadd_name_to_file, Sadd_name_to_file, 2, 3,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2310 "fAdd name to file: \nFName to add to %s: \np",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2311 "Give FILE additional name NEWNAME. Both args strings.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2312 Signals a `file-already-exists' error if a file NEWNAME already exists\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2313 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2314 A number as third arg means request confirmation if NEWNAME already exists.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2315 This is what happens in interactive use with M-x.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2316 (file, newname, ok_if_already_exists)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2317 Lisp_Object file, newname, ok_if_already_exists;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2318 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2319 #ifdef NO_ARG_ARRAY
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2320 Lisp_Object args[2];
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2321 #endif
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2322 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2323 struct gcpro gcpro1, gcpro2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2324
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2325 GCPRO2 (file, newname);
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2326 CHECK_STRING (file, 0);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2327 CHECK_STRING (newname, 1);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2328 file = Fexpand_file_name (file, Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2329 newname = Fexpand_file_name (newname, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2330
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2331 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2332 call the corresponding file handler. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2333 handler = Ffind_file_name_handler (file, Qadd_name_to_file);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2334 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2335 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
6370
51a014b7c656 (Frename_file, Fcopy_file, Fadd_name_to_file, Fmake_symbolic_link): Fix typo
Karl Heuer <kwzh@gnu.org>
parents: 6367
diff changeset
2336 newname, ok_if_already_exists));
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2337
12985
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2338 /* If the new name has special constructs in it,
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2339 call the corresponding file handler. */
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2340 handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2341 if (!NILP (handler))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2342 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
12985
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2343 newname, ok_if_already_exists));
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2344
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2345 if (NILP (ok_if_already_exists)
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
2346 || INTEGERP (ok_if_already_exists))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2347 barf_or_query_if_file_exists (newname, "make it a new name",
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2348 INTEGERP (ok_if_already_exists), 0);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2349 #ifdef WINDOWSNT
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2350 /* Windows does not support this operation. */
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2351 report_file_error ("Adding new name", Flist (2, &file));
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2352 #else /* not WINDOWSNT */
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2353
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2354 unlink (XSTRING (newname)->data);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2355 if (0 > link (XSTRING (file)->data, XSTRING (newname)->data))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2356 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2357 #ifdef NO_ARG_ARRAY
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2358 args[0] = file;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2359 args[1] = newname;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2360 report_file_error ("Adding new name", Flist (2, args));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2361 #else
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2362 report_file_error ("Adding new name", Flist (2, &file));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2363 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2364 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2365 #endif /* not WINDOWSNT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2366
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2367 UNGCPRO;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2368 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2369 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2370
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2371 #ifdef S_IFLNK
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2372 DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2373 "FMake symbolic link to file: \nFMake symbolic link to file %s: \np",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2374 "Make a symbolic link to FILENAME, named LINKNAME. Both args strings.\n\
8738
56c445a92c4c (Fset_default_file_modes): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 8703
diff changeset
2375 Signals a `file-already-exists' error if a file LINKNAME already exists\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2376 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.\n\
8738
56c445a92c4c (Fset_default_file_modes): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 8703
diff changeset
2377 A number as third arg means request confirmation if LINKNAME already exists.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2378 This happens for interactive use with M-x.")
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2379 (filename, linkname, ok_if_already_exists)
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2380 Lisp_Object filename, linkname, ok_if_already_exists;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2381 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2382 #ifdef NO_ARG_ARRAY
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2383 Lisp_Object args[2];
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2384 #endif
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2385 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2386 struct gcpro gcpro1, gcpro2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2387
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2388 GCPRO2 (filename, linkname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2389 CHECK_STRING (filename, 0);
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2390 CHECK_STRING (linkname, 1);
5245
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
2391 /* If the link target has a ~, we must expand it to get
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
2392 a truly valid file name. Otherwise, do not expand;
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
2393 we want to permit links to relative file names. */
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
2394 if (XSTRING (filename)->data[0] == '~')
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
2395 filename = Fexpand_file_name (filename, Qnil);
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2396 linkname = Fexpand_file_name (linkname, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2397
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2398 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2399 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2400 handler = Ffind_file_name_handler (filename, Qmake_symbolic_link);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2401 if (!NILP (handler))
6370
51a014b7c656 (Frename_file, Fcopy_file, Fadd_name_to_file, Fmake_symbolic_link): Fix typo
Karl Heuer <kwzh@gnu.org>
parents: 6367
diff changeset
2402 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
51a014b7c656 (Frename_file, Fcopy_file, Fadd_name_to_file, Fmake_symbolic_link): Fix typo
Karl Heuer <kwzh@gnu.org>
parents: 6367
diff changeset
2403 linkname, ok_if_already_exists));
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2404
12985
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2405 /* If the new link name has special constructs in it,
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2406 call the corresponding file handler. */
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2407 handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2408 if (!NILP (handler))
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2409 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2410 linkname, ok_if_already_exists));
3adacdaa1d3f (Fmake_symbolic_link, Fadd_name_to_file):
Richard M. Stallman <rms@gnu.org>
parents: 12853
diff changeset
2411
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2412 if (NILP (ok_if_already_exists)
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
2413 || INTEGERP (ok_if_already_exists))
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2414 barf_or_query_if_file_exists (linkname, "make it a link",
13098
e1d400bc526e (barf_or_query_if_file_exists): New arg STATPTR. Callers changed.
Richard M. Stallman <rms@gnu.org>
parents: 12985
diff changeset
2415 INTEGERP (ok_if_already_exists), 0);
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2416 if (0 > symlink (XSTRING (filename)->data, XSTRING (linkname)->data))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2417 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2418 /* If we didn't complain already, silently delete existing file. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2419 if (errno == EEXIST)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2420 {
2650
f378d89945e1 * fileio.c (Fmake_symbolic_link): If a file already exists under
Jim Blandy <jimb@redhat.com>
parents: 2607
diff changeset
2421 unlink (XSTRING (linkname)->data);
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2422 if (0 <= symlink (XSTRING (filename)->data, XSTRING (linkname)->data))
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2423 {
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2424 UNGCPRO;
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2425 return Qnil;
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2426 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2427 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2428
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2429 #ifdef NO_ARG_ARRAY
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2430 args[0] = filename;
732
a8d94735277e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 689
diff changeset
2431 args[1] = linkname;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2432 report_file_error ("Making symbolic link", Flist (2, args));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2433 #else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2434 report_file_error ("Making symbolic link", Flist (2, &filename));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2435 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2436 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2437 UNGCPRO;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2438 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2439 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2440 #endif /* S_IFLNK */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2441
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2442 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2443
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2444 DEFUN ("define-logical-name", Fdefine_logical_name, Sdefine_logical_name,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2445 2, 2, "sDefine logical name: \nsDefine logical name %s as: ",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2446 "Define the job-wide logical name NAME to have the value STRING.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2447 If STRING is nil or a null string, the logical name NAME is deleted.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2448 (name, string)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2449 Lisp_Object name;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2450 Lisp_Object string;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2451 {
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2452 CHECK_STRING (name, 0);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
2453 if (NILP (string))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2454 delete_logical_name (XSTRING (name)->data);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2455 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2456 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2457 CHECK_STRING (string, 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2458
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2459 if (XSTRING (string)->size == 0)
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2460 delete_logical_name (XSTRING (name)->data);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2461 else
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2462 define_logical_name (XSTRING (name)->data, XSTRING (string)->data);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2463 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2464
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2465 return string;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2466 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2467 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2468
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2469 #ifdef HPUX_NET
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2470
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2471 DEFUN ("sysnetunam", Fsysnetunam, Ssysnetunam, 2, 2, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2472 "Open a network connection to PATH using LOGIN as the login string.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2473 (path, login)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2474 Lisp_Object path, login;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2475 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2476 int netresult;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2477
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2478 CHECK_STRING (path, 0);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2479 CHECK_STRING (login, 0);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2480
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2481 netresult = netunam (XSTRING (path)->data, XSTRING (login)->data);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2482
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2483 if (netresult == -1)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2484 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2485 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2486 return Qt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2487 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2488 #endif /* HPUX_NET */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2489
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2490 DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2491 1, 1, 0,
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2492 "Return t if file FILENAME specifies an absolute file name.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2493 On Unix, this is a name starting with a `/' or a `~'.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2494 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2495 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2496 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2497 unsigned char *ptr;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2498
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2499 CHECK_STRING (filename, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2500 ptr = XSTRING (filename)->data;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2501 if (IS_DIRECTORY_SEP (*ptr) || *ptr == '~'
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2502 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2503 /* ??? This criterion is probably wrong for '<'. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2504 || index (ptr, ':') || index (ptr, '<')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2505 || (*ptr == '[' && (ptr[1] != '-' || (ptr[2] != '.' && ptr[2] != ']'))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2506 && ptr[1] != '.')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2507 #endif /* VMS */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2508 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2509 || (IS_DRIVE (*ptr) && ptr[1] == ':' && IS_DIRECTORY_SEP (ptr[2]))
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2510 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2511 )
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2512 return Qt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2513 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2514 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2515 }
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2516
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2517 /* Return nonzero if file FILENAME exists and can be executed. */
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2518
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2519 static int
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2520 check_executable (filename)
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2521 char *filename;
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2522 {
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2523 #ifdef DOS_NT
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2524 int len = strlen (filename);
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2525 char *suffix;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2526 struct stat st;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2527 if (stat (filename, &st) < 0)
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2528 return 0;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2529 #ifdef WINDOWSNT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2530 return ((st.st_mode & S_IEXEC) != 0);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2531 #else
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2532 return (S_ISREG (st.st_mode)
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2533 && len >= 5
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2534 && (stricmp ((suffix = filename + len-4), ".com") == 0
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2535 || stricmp (suffix, ".exe") == 0
13541
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2536 || stricmp (suffix, ".bat") == 0)
2178c4d6a427 (check_executable) [DOS_NT]: Treat all dirs as executable.
Richard M. Stallman <rms@gnu.org>
parents: 13451
diff changeset
2537 || (st.st_mode & S_IFMT) == S_IFDIR);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2538 #endif /* not WINDOWSNT */
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2539 #else /* not DOS_NT */
9374
347f919eea4a (check_writable, check_executable): Test HAVE_EACCESS.
Richard M. Stallman <rms@gnu.org>
parents: 9346
diff changeset
2540 #ifdef HAVE_EACCESS
9188
c17b2a49b6ec (check_writable, check_executable) [__HURD__]: Use eaccess.
Richard M. Stallman <rms@gnu.org>
parents: 9170
diff changeset
2541 return (eaccess (filename, 1) >= 0);
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2542 #else
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2543 /* Access isn't quite right because it uses the real uid
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2544 and we really want to test with the effective uid.
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2545 But Unix doesn't give us a right way to do it. */
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2546 return (access (filename, 1) >= 0);
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2547 #endif
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2548 #endif /* not DOS_NT */
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2549 }
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2550
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2551 /* Return nonzero if file FILENAME exists and can be written. */
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2552
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2553 static int
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2554 check_writable (filename)
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2555 char *filename;
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2556 {
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2557 #ifdef MSDOS
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2558 struct stat st;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2559 if (stat (filename, &st) < 0)
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2560 return 0;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2561 return (st.st_mode & S_IWRITE || (st.st_mode & S_IFMT) == S_IFDIR);
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2562 #else /* not MSDOS */
9374
347f919eea4a (check_writable, check_executable): Test HAVE_EACCESS.
Richard M. Stallman <rms@gnu.org>
parents: 9346
diff changeset
2563 #ifdef HAVE_EACCESS
9188
c17b2a49b6ec (check_writable, check_executable) [__HURD__]: Use eaccess.
Richard M. Stallman <rms@gnu.org>
parents: 9170
diff changeset
2564 return (eaccess (filename, 2) >= 0);
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2565 #else
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2566 /* Access isn't quite right because it uses the real uid
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2567 and we really want to test with the effective uid.
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2568 But Unix doesn't give us a right way to do it.
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2569 Opening with O_WRONLY could work for an ordinary file,
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2570 but would lose for directories. */
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2571 return (access (filename, 2) >= 0);
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2572 #endif
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2573 #endif /* not MSDOS */
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
2574 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2575
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2576 DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2577 "Return t if file FILENAME exists. (This does not mean you can read it.)\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2578 See also `file-readable-p' and `file-attributes'.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2579 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2580 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2581 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2582 Lisp_Object absname;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2583 Lisp_Object handler;
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
2584 struct stat statbuf;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2585
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2586 CHECK_STRING (filename, 0);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2587 absname = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2588
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2589 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2590 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2591 handler = Ffind_file_name_handler (absname, Qfile_exists_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2592 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2593 return call2 (handler, Qfile_exists_p, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2594
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2595 return (stat (XSTRING (absname)->data, &statbuf) >= 0) ? Qt : Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2596 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2597
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2598 DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2599 "Return t if FILENAME can be executed by you.\n\
2236
c26427fc12e2 Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 1869
diff changeset
2600 For a directory, this means you can access files in that directory.")
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2601 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2602 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2603
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2604 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2605 Lisp_Object absname;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2606 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2607
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2608 CHECK_STRING (filename, 0);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2609 absname = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2610
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2611 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2612 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2613 handler = Ffind_file_name_handler (absname, Qfile_executable_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2614 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2615 return call2 (handler, Qfile_executable_p, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2616
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2617 return (check_executable (XSTRING (absname)->data) ? Qt : Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2618 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2619
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2620 DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2621 "Return t if file FILENAME exists and you can read it.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2622 See also `file-exists-p' and `file-attributes'.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2623 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2624 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2625 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2626 Lisp_Object absname;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2627 Lisp_Object handler;
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
2628 int desc;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2629
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2630 CHECK_STRING (filename, 0);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2631 absname = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2632
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2633 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2634 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2635 handler = Ffind_file_name_handler (absname, Qfile_readable_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2636 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2637 return call2 (handler, Qfile_readable_p, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2638
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2639 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2640 /* Under MS-DOS and Windows, open does not work for directories. */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2641 if (access (XSTRING (absname)->data, 0) == 0)
13902
31e37f3d8ccd (Ffile_readable_p) [MSDOS]: Use access rather than open.
Richard M. Stallman <rms@gnu.org>
parents: 13769
diff changeset
2642 return Qt;
31e37f3d8ccd (Ffile_readable_p) [MSDOS]: Use access rather than open.
Richard M. Stallman <rms@gnu.org>
parents: 13769
diff changeset
2643 return Qnil;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2644 #else /* not DOS_NT */
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2645 desc = open (XSTRING (absname)->data, O_RDONLY);
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
2646 if (desc < 0)
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
2647 return Qnil;
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
2648 close (desc);
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
2649 return Qt;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2650 #endif /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2651 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2652
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2653 /* Having this before file-symlink-p mysteriously caused it to be forgotten
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2654 on the RT/PC. */
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2655 DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2656 "Return t if file FILENAME can be written or created by you.")
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2657 (filename)
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2658 Lisp_Object filename;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2659 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2660 Lisp_Object absname, dir;
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2661 Lisp_Object handler;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2662 struct stat statbuf;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2663
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2664 CHECK_STRING (filename, 0);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2665 absname = Fexpand_file_name (filename, Qnil);
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2666
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2667 /* If the file name has special constructs in it,
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2668 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2669 handler = Ffind_file_name_handler (absname, Qfile_writable_p);
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2670 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2671 return call2 (handler, Qfile_writable_p, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2672
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2673 if (stat (XSTRING (absname)->data, &statbuf) >= 0)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2674 return (check_writable (XSTRING (absname)->data)
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2675 ? Qt : Qnil);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2676 dir = Ffile_name_directory (absname);
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2677 #ifdef VMS
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2678 if (!NILP (dir))
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2679 dir = Fdirectory_file_name (dir);
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2680 #endif /* VMS */
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2681 #ifdef MSDOS
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2682 if (!NILP (dir))
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2683 dir = Fdirectory_file_name (dir);
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2684 #endif /* MSDOS */
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2685 return (check_writable (!NILP (dir) ? (char *) XSTRING (dir)->data : "")
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2686 ? Qt : Qnil);
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2687 }
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2688
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2689 DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0,
5616
67a8c4a8c80e (Ffile_symlink_p): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 5553
diff changeset
2690 "Return non-nil if file FILENAME is the name of a symbolic link.\n\
67a8c4a8c80e (Ffile_symlink_p): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 5553
diff changeset
2691 The value is the name of the file to which it is linked.\n\
67a8c4a8c80e (Ffile_symlink_p): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 5553
diff changeset
2692 Otherwise returns nil.")
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2693 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2694 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2695 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2696 #ifdef S_IFLNK
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2697 char *buf;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2698 int bufsize;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2699 int valsize;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2700 Lisp_Object val;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2701 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2702
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2703 CHECK_STRING (filename, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2704 filename = Fexpand_file_name (filename, Qnil);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2705
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2706 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2707 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2708 handler = Ffind_file_name_handler (filename, Qfile_symlink_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2709 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2710 return call2 (handler, Qfile_symlink_p, filename);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2711
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2712 bufsize = 100;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2713 while (1)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2714 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2715 buf = (char *) xmalloc (bufsize);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2716 bzero (buf, bufsize);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2717 valsize = readlink (XSTRING (filename)->data, buf, bufsize);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2718 if (valsize < bufsize) break;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2719 /* Buffer was not long enough */
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2435
diff changeset
2720 xfree (buf);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2721 bufsize *= 2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2722 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2723 if (valsize == -1)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2724 {
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2435
diff changeset
2725 xfree (buf);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2726 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2727 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2728 val = make_string (buf, valsize);
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2435
diff changeset
2729 xfree (buf);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2730 return val;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2731 #else /* not S_IFLNK */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2732 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2733 #endif /* not S_IFLNK */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2734 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2735
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2736 DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2737 "Return t if file FILENAME is the name of a directory as a file.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2738 A directory name spec may be given instead; then the value is t\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2739 if the directory so specified exists and really is a directory.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2740 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2741 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2742 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2743 register Lisp_Object absname;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2744 struct stat st;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2745 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2746
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2747 absname = expand_and_dir_to_file (filename, current_buffer->directory);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2748
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2749 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2750 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2751 handler = Ffind_file_name_handler (absname, Qfile_directory_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2752 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2753 return call2 (handler, Qfile_directory_p, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2754
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2755 if (stat (XSTRING (absname)->data, &st) < 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2756 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2757 return (st.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2758 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2759
536
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2760 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p, Sfile_accessible_directory_p, 1, 1, 0,
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2761 "Return t if file FILENAME is the name of a directory as a file,\n\
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2762 and files in that directory can be opened by you. In order to use a\n\
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2763 directory as a buffer's current directory, this predicate must return true.\n\
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2764 A directory name spec may be given instead; then the value is t\n\
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2765 if the directory so specified exists and really is a readable and\n\
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2766 searchable directory.")
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2767 (filename)
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2768 Lisp_Object filename;
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2769 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2770 Lisp_Object handler;
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2771 int tem;
8703
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2772 struct gcpro gcpro1;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2773
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2774 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2775 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2776 handler = Ffind_file_name_handler (filename, Qfile_accessible_directory_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2777 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2778 return call2 (handler, Qfile_accessible_directory_p, filename);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2779
8703
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2780 /* It's an unlikely combination, but yes we really do need to gcpro:
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2781 Suppose that file-accessible-directory-p has no handler, but
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2782 file-directory-p does have a handler; this handler causes a GC which
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2783 relocates the string in `filename'; and finally file-directory-p
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2784 returns non-nil. Then we would end up passing a garbaged string
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2785 to file-executable-p. */
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2786 GCPRO1 (filename);
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2787 tem = (NILP (Ffile_directory_p (filename))
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2788 || NILP (Ffile_executable_p (filename)));
8703
aaa0730f8b1e (Ffile_accessible_directory_p): Put back the gcpro.
Karl Heuer <kwzh@gnu.org>
parents: 8662
diff changeset
2789 UNGCPRO;
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2790 return tem ? Qnil : Qt;
536
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2791 }
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2792
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2793 DEFUN ("file-regular-p", Ffile_regular_p, Sfile_regular_p, 1, 1, 0,
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2794 "Return t if file FILENAME is the name of a regular file.\n\
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2795 This is the sort of file that holds an ordinary stream of data bytes.")
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2796 (filename)
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2797 Lisp_Object filename;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2798 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2799 register Lisp_Object absname;
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2800 struct stat st;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2801 Lisp_Object handler;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2802
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2803 absname = expand_and_dir_to_file (filename, current_buffer->directory);
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2804
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2805 /* If the file name has special constructs in it,
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2806 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2807 handler = Ffind_file_name_handler (absname, Qfile_regular_p);
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2808 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2809 return call2 (handler, Qfile_regular_p, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2810
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2811 if (stat (XSTRING (absname)->data, &st) < 0)
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2812 return Qnil;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2813 return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2814 }
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2815
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2816 DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2817 "Return mode bits of file named FILENAME, as an integer.")
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2818 (filename)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2819 Lisp_Object filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2820 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2821 Lisp_Object absname;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2822 struct stat st;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2823 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2824
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2825 absname = expand_and_dir_to_file (filename, current_buffer->directory);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2826
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2827 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2828 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2829 handler = Ffind_file_name_handler (absname, Qfile_modes);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2830 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2831 return call2 (handler, Qfile_modes, absname);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2832
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2833 if (stat (XSTRING (absname)->data, &st) < 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2834 return Qnil;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2835 #ifdef MSDOS
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2836 if (check_executable (XSTRING (absname)->data))
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
2837 st.st_mode |= S_IEXEC;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2838 #endif /* MSDOS */
6383
62db5566c287 (Ffile_modes) [MSDOS]: set exec-bit based on file suffix.
Karl Heuer <kwzh@gnu.org>
parents: 6370
diff changeset
2839
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2840 return make_number (st.st_mode & 07777);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2841 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2842
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2843 DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0,
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
2844 "Set mode bits of file named FILENAME to MODE (an integer).\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2845 Only the 12 low bits of MODE are used.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2846 (filename, mode)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2847 Lisp_Object filename, mode;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2848 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2849 Lisp_Object absname;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2850 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2851
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2852 absname = Fexpand_file_name (filename, current_buffer->directory);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2853 CHECK_NUMBER (mode, 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2854
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2855 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2856 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2857 handler = Ffind_file_name_handler (absname, Qset_file_modes);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2858 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2859 return call3 (handler, Qset_file_modes, absname, mode);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2860
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2861 if (chmod (XSTRING (absname)->data, XINT (mode)) < 0)
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2862 report_file_error ("Doing chmod", Fcons (absname, Qnil));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2863
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2864 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2865 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2866
1763
65e858c07a8b (Fset_default_file_modes, Fdefault_file_modes): Renamed from .._mode.
Richard M. Stallman <rms@gnu.org>
parents: 1762
diff changeset
2867 DEFUN ("set-default-file-modes", Fset_default_file_modes, Sset_default_file_modes, 1, 1, 0,
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2868 "Set the file permission bits for newly created files.\n\
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2869 The argument MODE should be an integer; only the low 9 bits are used.\n\
550
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2870 This setting is inherited by subprocesses.")
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2871 (mode)
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2872 Lisp_Object mode;
550
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2873 {
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2874 CHECK_NUMBER (mode, 0);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2875
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2876 umask ((~ XINT (mode)) & 0777);
550
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2877
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2878 return Qnil;
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2879 }
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2880
1763
65e858c07a8b (Fset_default_file_modes, Fdefault_file_modes): Renamed from .._mode.
Richard M. Stallman <rms@gnu.org>
parents: 1762
diff changeset
2881 DEFUN ("default-file-modes", Fdefault_file_modes, Sdefault_file_modes, 0, 0, 0,
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2882 "Return the default file protection for created files.\n\
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2883 The value is an integer.")
550
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2884 ()
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2885 {
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2886 int realmask;
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2887 Lisp_Object value;
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2888
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2889 realmask = umask (0);
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2890 umask (realmask);
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2891
9266
811ad893828b (Fdefault_file_modes, Finsert_file_contents, Fdo_auto_save): Use new accessor
Karl Heuer <kwzh@gnu.org>
parents: 9241
diff changeset
2892 XSETINT (value, (~ realmask) & 0777);
1762
d70878f22be4 (Fset_default_file_mode, Fdefault_file_mode):
Richard M. Stallman <rms@gnu.org>
parents: 1761
diff changeset
2893 return value;
550
3072b38789a7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 536
diff changeset
2894 }
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
2895
689
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2896 #ifdef unix
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2897
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2898 DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "",
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2899 "Tell Unix to finish all pending disk updates.")
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2900 ()
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2901 {
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2902 sync ();
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2903 return Qnil;
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2904 }
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2905
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2906 #endif /* unix */
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
2907
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2908 DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2909 "Return t if file FILE1 is newer than file FILE2.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2910 If FILE1 does not exist, the answer is nil;\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2911 otherwise, if FILE2 does not exist, the answer is t.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2912 (file1, file2)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2913 Lisp_Object file1, file2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2914 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2915 Lisp_Object absname1, absname2;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2916 struct stat st;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2917 int mtime1;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2918 Lisp_Object handler;
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
2919 struct gcpro gcpro1, gcpro2;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2920
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2921 CHECK_STRING (file1, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2922 CHECK_STRING (file2, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2923
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2924 absname1 = Qnil;
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2925 GCPRO2 (absname1, file2);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2926 absname1 = expand_and_dir_to_file (file1, current_buffer->directory);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2927 absname2 = expand_and_dir_to_file (file2, current_buffer->directory);
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
2928 UNGCPRO;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2929
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2930 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2931 call the corresponding file handler. */
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2932 handler = Ffind_file_name_handler (absname1, Qfile_newer_than_file_p);
3705
309c27256ceb (Fcopy_file): Pass all the args to the handler.
Richard M. Stallman <rms@gnu.org>
parents: 3598
diff changeset
2933 if (NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2934 handler = Ffind_file_name_handler (absname2, Qfile_newer_than_file_p);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2935 if (!NILP (handler))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2936 return call3 (handler, Qfile_newer_than_file_p, absname1, absname2);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2937
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2938 if (stat (XSTRING (absname1)->data, &st) < 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2939 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2940
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2941 mtime1 = st.st_mtime;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2942
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
2943 if (stat (XSTRING (absname2)->data, &st) < 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2944 return Qt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2945
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2946 return (mtime1 > st.st_mtime) ? Qt : Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2947 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2948
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2949 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2950 Lisp_Object Qfind_buffer_file_type;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
2951 #endif /* DOS_NT */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
2952
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2953 DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2954 1, 5, 0,
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2955 "Insert contents of file FILENAME after point.\n\
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
2956 Returns list of absolute file name and length of data inserted.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2957 If second argument VISIT is non-nil, the buffer's visited filename\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2958 and last save file modtime are set, and it is marked unmodified.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2959 If visiting and the file does not exist, visiting is completed\n\
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
2960 before the error is signaled.\n\n\
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
2961 The optional third and fourth arguments BEG and END\n\
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
2962 specify what portion of the file to insert.\n\
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2963 If VISIT is non-nil, BEG and END must be nil.\n\
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2964 If optional fifth argument REPLACE is non-nil,\n\
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2965 it means replace the current buffer contents (in the accessible portion)\n\
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2966 with the file contents. This is better than simply deleting and inserting\n\
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2967 the whole thing because (1) it preserves some marker positions\n\
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2968 and (2) it puts less data in the undo list.")
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2969 (filename, visit, beg, end, replace)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
2970 Lisp_Object filename, visit, beg, end, replace;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2971 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2972 struct stat st;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2973 register int fd;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2974 register int inserted = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2975 register int how_much;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2976 int count = specpdl_ptr - specpdl;
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2977 struct gcpro gcpro1, gcpro2, gcpro3;
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
2978 Lisp_Object handler, val, insval;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
2979 Lisp_Object p;
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
2980 int total;
9921
62392796a691 (Finsert_file_contents): Init not_regular at the beginning.
Richard M. Stallman <rms@gnu.org>
parents: 9915
diff changeset
2981 int not_regular = 0;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2982
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
2983 if (current_buffer->base_buffer && ! NILP (visit))
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
2984 error ("Cannot do file visiting in an indirect buffer");
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
2985
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
2986 if (!NILP (current_buffer->read_only))
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
2987 Fbarf_if_buffer_read_only ();
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
2988
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2989 val = Qnil;
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
2990 p = Qnil;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
2991
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
2992 GCPRO3 (filename, val, p);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2993
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2994 CHECK_STRING (filename, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2995 filename = Fexpand_file_name (filename, Qnil);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2996
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2997 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
2998 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
2999 handler = Ffind_file_name_handler (filename, Qinsert_file_contents);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3000 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3001 {
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3002 val = call6 (handler, Qinsert_file_contents, filename,
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3003 visit, beg, end, replace);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3004 goto handled;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3005 }
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3006
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3007 fd = -1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3008
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3009 #ifndef APOLLO
8047
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3010 if (stat (XSTRING (filename)->data, &st) < 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3011 #else
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
3012 if ((fd = open (XSTRING (filename)->data, O_RDONLY)) < 0
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3013 || fstat (fd, &st) < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3014 #endif /* not APOLLO */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3015 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3016 if (fd >= 0) close (fd);
8047
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3017 badopen:
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
3018 if (NILP (visit))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3019 report_file_error ("Opening input file", Fcons (filename, Qnil));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3020 st.st_mtime = -1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3021 how_much = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3022 goto notfound;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3023 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3024
8047
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3025 #ifdef S_IFREG
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3026 /* This code will need to be changed in order to work on named
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3027 pipes, and it's probably just not worth it. So we should at
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3028 least signal an error. */
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3029 if (!S_ISREG (st.st_mode))
9915
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3030 {
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3031 if (NILP (visit))
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3032 Fsignal (Qfile_error,
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3033 Fcons (build_string ("not a regular file"),
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3034 Fcons (filename, Qnil)));
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3035
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3036 not_regular = 1;
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3037 goto notfound;
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3038 }
8047
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3039 #endif
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3040
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3041 if (fd < 0)
8597
cfd5153bc220 (O_RDONLY): Defined.
Richard M. Stallman <rms@gnu.org>
parents: 8587
diff changeset
3042 if ((fd = open (XSTRING (filename)->data, O_RDONLY)) < 0)
8047
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3043 goto badopen;
fb950b66d754 (Finsert_file_contents): Fix check for non-regular files.
Karl Heuer <kwzh@gnu.org>
parents: 7695
diff changeset
3044
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3045 /* Replacement should preserve point as it preserves markers. */
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3046 if (!NILP (replace))
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3047 record_unwind_protect (restore_point_unwind, Fpoint_marker ());
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3048
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3049 record_unwind_protect (close_file_unwind, make_number (fd));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3050
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3051 /* Supposedly happens on VMS. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3052 if (st.st_size < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3053 error ("File size is negative");
752
f7c08f6bd753 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 732
diff changeset
3054
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3055 if (!NILP (beg) || !NILP (end))
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3056 if (!NILP (visit))
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3057 error ("Attempt to visit less than an entire file");
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3058
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3059 if (!NILP (beg))
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3060 CHECK_NUMBER (beg, 0);
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3061 else
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3062 XSETFASTINT (beg, 0);
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3063
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3064 if (!NILP (end))
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3065 CHECK_NUMBER (end, 0);
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3066 else
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3067 {
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3068 XSETINT (end, st.st_size);
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3069 if (XINT (end) != st.st_size)
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3070 error ("maximum buffer size exceeded");
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3071 }
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3072
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3073 /* If requested, replace the accessible part of the buffer
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3074 with the file contents. Avoid replacing text at the
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3075 beginning or end of the buffer that matches the file contents;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3076 that preserves markers pointing to the unchanged parts. */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3077 #ifdef DOS_NT
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3078 /* On MSDOS, replace mode doesn't really work, except for binary files,
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3079 and it's not worth supporting just for them. */
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3080 if (!NILP (replace))
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3081 {
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3082 replace = Qnil;
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3083 XSETFASTINT (beg, 0);
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3084 XSETFASTINT (end, st.st_size);
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3085 del_range_1 (BEGV, ZV, 0);
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
3086 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3087 #else /* not DOS_NT */
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3088 if (!NILP (replace))
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3089 {
7549
ccb8b7f8dce7 (syms_of_fileio): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 7526
diff changeset
3090 unsigned char buffer[1 << 14];
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3091 int same_at_start = BEGV;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3092 int same_at_end = ZV;
6328
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3093 int overlap;
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3094
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3095 immediate_quit = 1;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3096 QUIT;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3097 /* Count how many chars at the start of the file
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3098 match the text at the beginning of the buffer. */
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3099 while (1)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3100 {
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3101 int nread, bufpos;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3102
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3103 nread = read (fd, buffer, sizeof buffer);
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3104 if (nread < 0)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3105 error ("IO error reading %s: %s",
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3106 XSTRING (filename)->data, strerror (errno));
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3107 else if (nread == 0)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3108 break;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3109 bufpos = 0;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3110 while (bufpos < nread && same_at_start < ZV
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3111 && FETCH_CHAR (same_at_start) == buffer[bufpos])
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3112 same_at_start++, bufpos++;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3113 /* If we found a discrepancy, stop the scan.
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13902
diff changeset
3114 Otherwise loop around and scan the next bufferful. */
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3115 if (bufpos != nread)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3116 break;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3117 }
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3118 immediate_quit = 0;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3119 /* If the file matches the buffer completely,
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3120 there's no need to replace anything. */
7595
9f0893928a4d (Finsert_file_contents): Declare buffer as unsigned
Richard M. Stallman <rms@gnu.org>
parents: 7551
diff changeset
3121 if (same_at_start - BEGV == st.st_size)
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3122 {
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3123 close (fd);
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3124 specpdl_ptr--;
7595
9f0893928a4d (Finsert_file_contents): Declare buffer as unsigned
Richard M. Stallman <rms@gnu.org>
parents: 7551
diff changeset
3125 /* Truncate the buffer to the size of the file. */
9f0893928a4d (Finsert_file_contents): Declare buffer as unsigned
Richard M. Stallman <rms@gnu.org>
parents: 7551
diff changeset
3126 del_range_1 (same_at_start, same_at_end, 0);
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3127 goto handled;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3128 }
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3129 immediate_quit = 1;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3130 QUIT;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3131 /* Count how many chars at the end of the file
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3132 match the text at the end of the buffer. */
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3133 while (1)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3134 {
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3135 int total_read, nread, bufpos, curpos, trial;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3136
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3137 /* At what file position are we now scanning? */
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3138 curpos = st.st_size - (ZV - same_at_end);
7695
aba3ffcc8f51 (Finsert_file_contents): Check for beginning of file.
Karl Heuer <kwzh@gnu.org>
parents: 7611
diff changeset
3139 /* If the entire file matches the buffer tail, stop the scan. */
aba3ffcc8f51 (Finsert_file_contents): Check for beginning of file.
Karl Heuer <kwzh@gnu.org>
parents: 7611
diff changeset
3140 if (curpos == 0)
aba3ffcc8f51 (Finsert_file_contents): Check for beginning of file.
Karl Heuer <kwzh@gnu.org>
parents: 7611
diff changeset
3141 break;
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3142 /* How much can we scan in the next step? */
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3143 trial = min (curpos, sizeof buffer);
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3144 if (lseek (fd, curpos - trial, 0) < 0)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3145 report_file_error ("Setting file position",
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3146 Fcons (filename, Qnil));
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3147
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3148 total_read = 0;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3149 while (total_read < trial)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3150 {
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3151 nread = read (fd, buffer + total_read, trial - total_read);
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3152 if (nread <= 0)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3153 error ("IO error reading %s: %s",
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3154 XSTRING (filename)->data, strerror (errno));
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3155 total_read += nread;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3156 }
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13902
diff changeset
3157 /* Scan this bufferful from the end, comparing with
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3158 the Emacs buffer. */
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3159 bufpos = total_read;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3160 /* Compare with same_at_start to avoid counting some buffer text
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3161 as matching both at the file's beginning and at the end. */
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3162 while (bufpos > 0 && same_at_end > same_at_start
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3163 && FETCH_CHAR (same_at_end - 1) == buffer[bufpos - 1])
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3164 same_at_end--, bufpos--;
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3165 /* If we found a discrepancy, stop the scan.
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13902
diff changeset
3166 Otherwise loop around and scan the preceding bufferful. */
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3167 if (bufpos != 0)
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3168 break;
13221
994440ef957f (Finsert_file_contents): If replacing,
Richard M. Stallman <rms@gnu.org>
parents: 13098
diff changeset
3169 /* If display current starts at beginning of line,
994440ef957f (Finsert_file_contents): If replacing,
Richard M. Stallman <rms@gnu.org>
parents: 13098
diff changeset
3170 keep it that way. */
994440ef957f (Finsert_file_contents): If replacing,
Richard M. Stallman <rms@gnu.org>
parents: 13098
diff changeset
3171 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
994440ef957f (Finsert_file_contents): If replacing,
Richard M. Stallman <rms@gnu.org>
parents: 13098
diff changeset
3172 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3173 }
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3174 immediate_quit = 0;
6328
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3175
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3176 /* Don't try to reuse the same piece of text twice. */
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3177 overlap = same_at_start - BEGV - (same_at_end + st.st_size - ZV);
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3178 if (overlap > 0)
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3179 same_at_end += overlap;
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3180
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3181 /* Arrange to read only the nonmatching middle part of the file. */
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3182 XSETFASTINT (beg, same_at_start - BEGV);
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3183 XSETFASTINT (end, st.st_size - (ZV - same_at_end));
6328
e97a1cc44be8 (Finsert_file_contents): Don't let same_at_end be less than same_at_start.
Richard M. Stallman <rms@gnu.org>
parents: 6209
diff changeset
3184
6194
b094b321b4a6 (Finsert_file_contents): Pass del_range_1 two ends, not a length.
Richard M. Stallman <rms@gnu.org>
parents: 6181
diff changeset
3185 del_range_1 (same_at_start, same_at_end, 0);
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3186 /* Insert from the file at the proper position. */
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3187 SET_PT (same_at_start);
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3188 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3189 #endif /* not DOS_NT */
5975
c766d816b07e (Finsert_file_contents): New arg REPLACE.
Richard M. Stallman <rms@gnu.org>
parents: 5908
diff changeset
3190
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3191 total = XINT (end) - XINT (beg);
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3192
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3193 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3194 register Lisp_Object temp;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3195
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3196 /* Make sure point-max won't overflow after this insertion. */
9266
811ad893828b (Fdefault_file_modes, Finsert_file_contents, Fdo_auto_save): Use new accessor
Karl Heuer <kwzh@gnu.org>
parents: 9241
diff changeset
3197 XSETINT (temp, total);
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3198 if (total != XINT (temp))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3199 error ("maximum buffer size exceeded");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3200 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3201
4395
76b24be40a57 (Finsert_file_contents): Don't call prepare_to_modify_buffer
Richard M. Stallman <rms@gnu.org>
parents: 4270
diff changeset
3202 if (NILP (visit) && total > 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3203 prepare_to_modify_buffer (point, point);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3204
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3205 move_gap (point);
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3206 if (GAP_SIZE < total)
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3207 make_gap (total - GAP_SIZE);
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3208
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3209 if (XINT (beg) != 0 || !NILP (replace))
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3210 {
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3211 if (lseek (fd, XINT (beg), 0) < 0)
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3212 report_file_error ("Setting file position", Fcons (filename, Qnil));
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3213 }
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3214
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3215 how_much = 0;
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3216 while (inserted < total)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3217 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3218 /* try is reserved in some compilers (Microsoft C) */
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3219 int trytry = min (total - inserted, 64 << 10);
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
3220 int this;
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
3221
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
3222 /* Allow quitting out of the actual I/O. */
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
3223 immediate_quit = 1;
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
3224 QUIT;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3225 this = read (fd, &FETCH_CHAR (point + inserted - 1) + 1, trytry);
592
e65af468dcc2 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 564
diff changeset
3226 immediate_quit = 0;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3227
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3228 if (this <= 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3229 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3230 how_much = this;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3231 break;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3232 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3233
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3234 GPT += this;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3235 GAP_SIZE -= this;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3236 ZV += this;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3237 Z += this;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3238 inserted += this;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3239 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3240
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3241 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3242 /* Demacs 1.1.1 91/10/16 HIRANO Satoshi, MW July 1993 */
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3243 /* Determine file type from name and remove LFs from CR-LFs if the file
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3244 is deemed to be a text file. */
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3245 {
7130
b3e9a76134d2 (Finsert_file_contents): Fix accessing buffer_file_type
Richard M. Stallman <rms@gnu.org>
parents: 7041
diff changeset
3246 current_buffer->buffer_file_type
b3e9a76134d2 (Finsert_file_contents): Fix accessing buffer_file_type
Richard M. Stallman <rms@gnu.org>
parents: 7041
diff changeset
3247 = call1 (Qfind_buffer_file_type, filename);
b3e9a76134d2 (Finsert_file_contents): Fix accessing buffer_file_type
Richard M. Stallman <rms@gnu.org>
parents: 7041
diff changeset
3248 if (NILP (current_buffer->buffer_file_type))
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3249 {
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3250 int reduced_size
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3251 = inserted - crlf_to_lf (inserted, &FETCH_CHAR (point - 1) + 1);
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3252 ZV -= reduced_size;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3253 Z -= reduced_size;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3254 GPT -= reduced_size;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3255 GAP_SIZE += reduced_size;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3256 inserted -= reduced_size;
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3257 }
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3258 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3259 #endif /* DOS_NT */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3260
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3261 if (inserted > 0)
1240
7365d006d0a0 (Finsert_file_contents): Do record_insert, then inc MODIFF.
Richard M. Stallman <rms@gnu.org>
parents: 1204
diff changeset
3262 {
7365d006d0a0 (Finsert_file_contents): Do record_insert, then inc MODIFF.
Richard M. Stallman <rms@gnu.org>
parents: 1204
diff changeset
3263 record_insert (point, inserted);
1299
b8337cdf2e8b * fileio.c (Finsert_file_contents): Call offset_intervals() if
Joseph Arceneaux <jla@gnu.org>
parents: 1240
diff changeset
3264
b8337cdf2e8b * fileio.c (Finsert_file_contents): Call offset_intervals() if
Joseph Arceneaux <jla@gnu.org>
parents: 1240
diff changeset
3265 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
b8337cdf2e8b * fileio.c (Finsert_file_contents): Call offset_intervals() if
Joseph Arceneaux <jla@gnu.org>
parents: 1240
diff changeset
3266 offset_intervals (current_buffer, point, inserted);
1240
7365d006d0a0 (Finsert_file_contents): Do record_insert, then inc MODIFF.
Richard M. Stallman <rms@gnu.org>
parents: 1204
diff changeset
3267 MODIFF++;
7365d006d0a0 (Finsert_file_contents): Do record_insert, then inc MODIFF.
Richard M. Stallman <rms@gnu.org>
parents: 1204
diff changeset
3268 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3269
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3270 close (fd);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3271
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3272 /* Discard the unwind protect for closing the file. */
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3273 specpdl_ptr--;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3274
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3275 if (how_much < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3276 error ("IO error reading %s: %s",
5517
8b2b6a296cda Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents: 5494
diff changeset
3277 XSTRING (filename)->data, strerror (errno));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3278
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3279 notfound:
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3280 handled:
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3281
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
3282 if (!NILP (visit))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3283 {
6177
ac2ef13dca1b (Finsert_file_contents): If undo_list was t, leave it t.
Richard M. Stallman <rms@gnu.org>
parents: 6036
diff changeset
3284 if (!EQ (current_buffer->undo_list, Qt))
ac2ef13dca1b (Finsert_file_contents): If undo_list was t, leave it t.
Richard M. Stallman <rms@gnu.org>
parents: 6036
diff changeset
3285 current_buffer->undo_list = Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3286 #ifdef APOLLO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3287 stat (XSTRING (filename)->data, &st);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3288 #endif
5390
d9c81d7079f3 (Finsert_file_contents): Don't run after change hook
Richard M. Stallman <rms@gnu.org>
parents: 5351
diff changeset
3289
5395
e11486a64dab (Finsert_file_contents): Avoid setting buffer-file-name field if ran a handler.
Richard M. Stallman <rms@gnu.org>
parents: 5390
diff changeset
3290 if (NILP (handler))
e11486a64dab (Finsert_file_contents): Avoid setting buffer-file-name field if ran a handler.
Richard M. Stallman <rms@gnu.org>
parents: 5390
diff changeset
3291 {
e11486a64dab (Finsert_file_contents): Avoid setting buffer-file-name field if ran a handler.
Richard M. Stallman <rms@gnu.org>
parents: 5390
diff changeset
3292 current_buffer->modtime = st.st_mtime;
e11486a64dab (Finsert_file_contents): Avoid setting buffer-file-name field if ran a handler.
Richard M. Stallman <rms@gnu.org>
parents: 5390
diff changeset
3293 current_buffer->filename = filename;
e11486a64dab (Finsert_file_contents): Avoid setting buffer-file-name field if ran a handler.
Richard M. Stallman <rms@gnu.org>
parents: 5390
diff changeset
3294 }
5390
d9c81d7079f3 (Finsert_file_contents): Don't run after change hook
Richard M. Stallman <rms@gnu.org>
parents: 5351
diff changeset
3295
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
3296 SAVE_MODIFF = MODIFF;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3297 current_buffer->auto_save_modified = MODIFF;
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3298 XSETFASTINT (current_buffer->save_length, Z - BEG);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3299 #ifdef CLASH_DETECTION
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3300 if (NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3301 {
11658
304577bc9b51 (Finsert_file_contents): Use file_truename for unlocking.
Richard M. Stallman <rms@gnu.org>
parents: 11632
diff changeset
3302 if (!NILP (current_buffer->file_truename))
304577bc9b51 (Finsert_file_contents): Use file_truename for unlocking.
Richard M. Stallman <rms@gnu.org>
parents: 11632
diff changeset
3303 unlock_file (current_buffer->file_truename);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3304 unlock_file (filename);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3305 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3306 #endif /* CLASH_DETECTION */
9915
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3307 if (not_regular)
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3308 Fsignal (Qfile_error,
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3309 Fcons (build_string ("not a regular file"),
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3310 Fcons (filename, Qnil)));
ec185bc66071 (Finsert_file_contents): If VISIT, set the buffer components
Richard M. Stallman <rms@gnu.org>
parents: 9872
diff changeset
3311
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3312 /* If visiting nonexistent file, return nil. */
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3313 if (current_buffer->modtime == -1)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3314 report_file_error ("Opening input file", Fcons (filename, Qnil));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3315 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3316
11053
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3317 /* Decode file format */
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3318 if (inserted > 0)
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3319 {
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3320 insval = call3 (Qformat_decode,
11053
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3321 Qnil, make_number (inserted), visit);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3322 CHECK_NUMBER (insval, 0);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3323 inserted = XFASTINT (insval);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3324 }
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3325
5390
d9c81d7079f3 (Finsert_file_contents): Don't run after change hook
Richard M. Stallman <rms@gnu.org>
parents: 5351
diff changeset
3326 if (inserted > 0 && NILP (visit) && total > 0)
5129
d48d18e20316 (Finsert_file_contents): Don't call signal_after_change
Richard M. Stallman <rms@gnu.org>
parents: 4989
diff changeset
3327 signal_after_change (point, 0, inserted);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3328
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3329 if (inserted > 0)
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3330 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3331 p = Vafter_insert_file_functions;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3332 while (!NILP (p))
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3333 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3334 insval = call1 (Fcar (p), make_number (inserted));
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3335 if (!NILP (insval))
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3336 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3337 CHECK_NUMBER (insval, 0);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3338 inserted = XFASTINT (insval);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3339 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3340 QUIT;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3341 p = Fcdr (p);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3342 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3343 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3344
6036
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3345 if (NILP (val))
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3346 val = Fcons (filename,
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3347 Fcons (make_number (inserted),
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3348 Qnil));
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3349
7e9984c9a36e (Finsert_file_contents): If REPLACE, always do lseek.
Richard M. Stallman <rms@gnu.org>
parents: 5978
diff changeset
3350 RETURN_UNGCPRO (unbind_to (count, val));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3351 }
3787
04b741620a50 * fileio.c (Finsert_file_contents): Two new args, BEG and END.
Jim Blandy <jimb@redhat.com>
parents: 3721
diff changeset
3352
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3353 static Lisp_Object build_annotations ();
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3354
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3355 /* If build_annotations switched buffers, switch back to BUF.
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3356 Kill the temporary buffer that was selected in the meantime. */
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3357
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3358 static Lisp_Object
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3359 build_annotations_unwind (buf)
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3360 Lisp_Object buf;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3361 {
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3362 Lisp_Object tembuf;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3363
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3364 if (XBUFFER (buf) == current_buffer)
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3365 return Qnil;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3366 tembuf = Fcurrent_buffer ();
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3367 Fset_buffer (buf);
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3368 Fkill_buffer (tembuf);
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3369 return Qnil;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3370 }
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3371
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3372 DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 6,
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3373 "r\nFWrite region to file: ",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3374 "Write current region into specified file.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3375 When called from a program, takes three arguments:\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3376 START, END and FILENAME. START and END are buffer positions.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3377 Optional fourth argument APPEND if non-nil means\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3378 append to existing file contents (if any).\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3379 Optional fifth argument VISIT if t means\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3380 set the last-save-file-modtime of buffer to this file's modtime\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3381 and mark buffer not modified.\n\
1377
dcec08a3bec4 (Fwrite_region): If VISIT is a file name,
Richard M. Stallman <rms@gnu.org>
parents: 1358
diff changeset
3382 If VISIT is a string, it is a second file name;\n\
dcec08a3bec4 (Fwrite_region): If VISIT is a file name,
Richard M. Stallman <rms@gnu.org>
parents: 1358
diff changeset
3383 the output goes to FILENAME, but the buffer is marked as visiting VISIT.\n\
dcec08a3bec4 (Fwrite_region): If VISIT is a file name,
Richard M. Stallman <rms@gnu.org>
parents: 1358
diff changeset
3384 VISIT is also the file name to lock and unlock for clash detection.\n\
1761
b9ef55b0df4a (Fwrite_region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 1679
diff changeset
3385 If VISIT is neither t nor nil nor a string,\n\
b9ef55b0df4a (Fwrite_region): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 1679
diff changeset
3386 that means do not print the \"Wrote file\" message.\n\
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3387 The optional sixth arg LOCKNAME, if non-nil, specifies the name to\n\
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3388 use for locking and unlocking, overriding FILENAME and VISIT.\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3389 Kludgy feature: if START is a string, then that string is written\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3390 to the file, instead of any buffer contents, and END is ignored.")
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3391 (start, end, filename, append, visit, lockname)
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3392 Lisp_Object start, end, filename, append, visit, lockname;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3393 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3394 register int desc;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3395 int failure;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3396 int save_errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3397 unsigned char *fn;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3398 struct stat st;
4950
145c69e39666 (Fwrite_region): Fix minor bugs in POS arg to awrite.
Richard M. Stallman <rms@gnu.org>
parents: 4879
diff changeset
3399 int tem;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3400 int count = specpdl_ptr - specpdl;
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3401 int count1;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3402 #ifdef VMS
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3403 unsigned char *fname = 0; /* If non-0, original filename (must rename) */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3404 #endif /* VMS */
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
3405 Lisp_Object handler;
2407
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
3406 Lisp_Object visit_file;
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3407 Lisp_Object annotations;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3408 int visiting, quietly;
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3409 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3410 struct buffer *given_buffer;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3411 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3412 int buffer_file_type
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3413 = NILP (current_buffer->buffer_file_type) ? O_TEXT : O_BINARY;
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3414 #endif /* DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3415
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
3416 if (current_buffer->base_buffer && ! NILP (visit))
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
3417 error ("Cannot do file visiting in an indirect buffer");
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
3418
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3419 if (!NILP (start) && !STRINGP (start))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3420 validate_region (&start, &end);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3421
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3422 GCPRO3 (filename, visit, lockname);
2407
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
3423 filename = Fexpand_file_name (filename, Qnil);
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3424 if (STRINGP (visit))
2435
b72453ad92ae (Fwrite_region): Don't fail to set visit_file.
Richard M. Stallman <rms@gnu.org>
parents: 2407
diff changeset
3425 visit_file = Fexpand_file_name (visit, Qnil);
2407
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
3426 else
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
3427 visit_file = filename;
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
3428 UNGCPRO;
2407
1c590cd84ab3 (Fexpand_file_name): Default DEFALT at beginning,
Richard M. Stallman <rms@gnu.org>
parents: 2280
diff changeset
3429
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3430 visiting = (EQ (visit, Qt) || STRINGP (visit));
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3431 quietly = !NILP (visit);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3432
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3433 annotations = Qnil;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3434
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3435 if (NILP (lockname))
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3436 lockname = visit_file;
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3437
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3438 GCPRO5 (start, filename, annotations, visit_file, lockname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3439
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3440 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3441 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
3442 handler = Ffind_file_name_handler (filename, Qwrite_region);
5758
23821c197271 (Fwrite_region): If FILENAME has no handler, see if VISIT has one.
Richard M. Stallman <rms@gnu.org>
parents: 5647
diff changeset
3443 /* If FILENAME has no handler, see if VISIT has one. */
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
3444 if (NILP (handler) && STRINGP (visit))
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3445 handler = Ffind_file_name_handler (visit, Qwrite_region);
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
3446
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3447 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3448 {
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3449 Lisp_Object val;
3705
309c27256ceb (Fcopy_file): Pass all the args to the handler.
Richard M. Stallman <rms@gnu.org>
parents: 3598
diff changeset
3450 val = call6 (handler, Qwrite_region, start, end,
309c27256ceb (Fcopy_file): Pass all the args to the handler.
Richard M. Stallman <rms@gnu.org>
parents: 3598
diff changeset
3451 filename, append, visit);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3452
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3453 if (visiting)
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3454 {
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
3455 SAVE_MODIFF = MODIFF;
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3456 XSETFASTINT (current_buffer->save_length, Z - BEG);
1377
dcec08a3bec4 (Fwrite_region): If VISIT is a file name,
Richard M. Stallman <rms@gnu.org>
parents: 1358
diff changeset
3457 current_buffer->filename = visit_file;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3458 }
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
3459 UNGCPRO;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3460 return val;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3461 }
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3462
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3463 /* Special kludge to simplify auto-saving. */
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3464 if (NILP (start))
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3465 {
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3466 XSETFASTINT (start, BEG);
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3467 XSETFASTINT (end, Z);
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3468 }
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3469
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3470 record_unwind_protect (build_annotations_unwind, Fcurrent_buffer ());
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3471 count1 = specpdl_ptr - specpdl;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3472
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3473 given_buffer = current_buffer;
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3474 annotations = build_annotations (start, end);
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3475 if (current_buffer != given_buffer)
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3476 {
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3477 start = BEGV;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3478 end = ZV;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3479 }
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3480
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3481 #ifdef CLASH_DETECTION
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3482 if (!auto_saving)
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3483 lock_file (lockname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3484 #endif /* CLASH_DETECTION */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3485
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
3486 fn = XSTRING (filename)->data;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3487 desc = -1;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
3488 if (!NILP (append))
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3489 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3490 desc = open (fn, O_WRONLY | buffer_file_type);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3491 #else /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3492 desc = open (fn, O_WRONLY);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3493 #endif /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3494
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3495 if (desc < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3496 #ifdef VMS
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3497 if (auto_saving) /* Overwrite any previous version of autosave file */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3498 {
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3499 vms_truncate (fn); /* if fn exists, truncate to zero length */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3500 desc = open (fn, O_RDWR);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3501 if (desc < 0)
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3502 desc = creat_copy_attrs (STRINGP (current_buffer->filename)
536
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
3503 ? XSTRING (current_buffer->filename)->data : 0,
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
3504 fn);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3505 }
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3506 else /* Write to temporary name and rename if no errors */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3507 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3508 Lisp_Object temp_name;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3509 temp_name = Ffile_name_directory (filename);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3510
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
3511 if (!NILP (temp_name))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3512 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3513 temp_name = Fmake_temp_name (concat2 (temp_name,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3514 build_string ("$$SAVE$$")));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3515 fname = XSTRING (filename)->data;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3516 fn = XSTRING (temp_name)->data;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3517 desc = creat_copy_attrs (fname, fn);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3518 if (desc < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3519 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3520 /* If we can't open the temporary file, try creating a new
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3521 version of the original file. VMS "creat" creates a
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3522 new version rather than truncating an existing file. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3523 fn = fname;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3524 fname = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3525 desc = creat (fn, 0666);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3526 #if 0 /* This can clobber an existing file and fail to replace it,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3527 if the user runs out of space. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3528 if (desc < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3529 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3530 /* We can't make a new version;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3531 try to truncate and rewrite existing version if any. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3532 vms_truncate (fn);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3533 desc = open (fn, O_RDWR);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3534 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3535 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3536 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3537 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3538 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3539 desc = creat (fn, 0666);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3540 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3541 #else /* not VMS */
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3542 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3543 desc = open (fn,
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3544 O_WRONLY | O_TRUNC | O_CREAT | buffer_file_type,
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
3545 S_IREAD | S_IWRITE);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3546 #else /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3547 desc = creat (fn, auto_saving ? auto_save_mode_bits : 0666);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
3548 #endif /* not DOS_NT */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3549 #endif /* not VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3550
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
3551 UNGCPRO;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
3552
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3553 if (desc < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3554 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3555 #ifdef CLASH_DETECTION
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3556 save_errno = errno;
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3557 if (!auto_saving) unlock_file (lockname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3558 errno = save_errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3559 #endif /* CLASH_DETECTION */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3560 report_file_error ("Opening output file", Fcons (filename, Qnil));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3561 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3562
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3563 record_unwind_protect (close_file_unwind, make_number (desc));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3564
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
3565 if (!NILP (append))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3566 if (lseek (desc, 0, 2) < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3567 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3568 #ifdef CLASH_DETECTION
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3569 if (!auto_saving) unlock_file (lockname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3570 #endif /* CLASH_DETECTION */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3571 report_file_error ("Lseek error", Fcons (filename, Qnil));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3572 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3573
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3574 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3575 /*
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3576 * Kludge Warning: The VMS C RTL likes to insert carriage returns
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3577 * if we do writes that don't end with a carriage return. Furthermore
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3578 * it cannot handle writes of more then 16K. The modified
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3579 * version of "sys_write" in SYSDEP.C (see comment there) copes with
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3580 * this EXCEPT for the last record (iff it doesn't end with a carriage
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3581 * return). This implies that if your buffer doesn't end with a carriage
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3582 * return, you get one free... tough. However it also means that if
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3583 * we make two calls to sys_write (a la the following code) you can
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3584 * get one at the gap as well. The easiest way to fix this (honest)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3585 * is to move the gap to the next newline (or the end of the buffer).
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3586 * Thus this change.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3587 *
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3588 * Yech!
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3589 */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3590 if (GPT > BEG && GPT_ADDR[-1] != '\n')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3591 move_gap (find_next_newline (GPT, 1));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3592 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3593
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3594 failure = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3595 immediate_quit = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3596
5410
c96b98efb5b4 (Fwrite_region): Don't change START and END from nil
Richard M. Stallman <rms@gnu.org>
parents: 5395
diff changeset
3597 if (STRINGP (start))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3598 {
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3599 failure = 0 > a_write (desc, XSTRING (start)->data,
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3600 XSTRING (start)->size, 0, &annotations);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3601 save_errno = errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3602 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3603 else if (XINT (start) != XINT (end))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3604 {
4950
145c69e39666 (Fwrite_region): Fix minor bugs in POS arg to awrite.
Richard M. Stallman <rms@gnu.org>
parents: 4879
diff changeset
3605 int nwritten = 0;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3606 if (XINT (start) < GPT)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3607 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3608 register int end1 = XINT (end);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3609 tem = XINT (start);
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3610 failure = 0 > a_write (desc, &FETCH_CHAR (tem),
4950
145c69e39666 (Fwrite_region): Fix minor bugs in POS arg to awrite.
Richard M. Stallman <rms@gnu.org>
parents: 4879
diff changeset
3611 min (GPT, end1) - tem, tem, &annotations);
145c69e39666 (Fwrite_region): Fix minor bugs in POS arg to awrite.
Richard M. Stallman <rms@gnu.org>
parents: 4879
diff changeset
3612 nwritten += min (GPT, end1) - tem;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3613 save_errno = errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3614 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3615
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3616 if (XINT (end) > GPT && !failure)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3617 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3618 tem = XINT (start);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3619 tem = max (tem, GPT);
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3620 failure = 0 > a_write (desc, &FETCH_CHAR (tem), XINT (end) - tem,
4950
145c69e39666 (Fwrite_region): Fix minor bugs in POS arg to awrite.
Richard M. Stallman <rms@gnu.org>
parents: 4879
diff changeset
3621 tem, &annotations);
145c69e39666 (Fwrite_region): Fix minor bugs in POS arg to awrite.
Richard M. Stallman <rms@gnu.org>
parents: 4879
diff changeset
3622 nwritten += XINT (end) - tem;
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3623 save_errno = errno;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3624 }
13451
3a69848f7892 (Fwrite_region): Move the code that writes annotations for empty files.
Richard M. Stallman <rms@gnu.org>
parents: 13221
diff changeset
3625 }
3a69848f7892 (Fwrite_region): Move the code that writes annotations for empty files.
Richard M. Stallman <rms@gnu.org>
parents: 13221
diff changeset
3626 else
3a69848f7892 (Fwrite_region): Move the code that writes annotations for empty files.
Richard M. Stallman <rms@gnu.org>
parents: 13221
diff changeset
3627 {
3a69848f7892 (Fwrite_region): Move the code that writes annotations for empty files.
Richard M. Stallman <rms@gnu.org>
parents: 13221
diff changeset
3628 /* If file was empty, still need to write the annotations */
3a69848f7892 (Fwrite_region): Move the code that writes annotations for empty files.
Richard M. Stallman <rms@gnu.org>
parents: 13221
diff changeset
3629 failure = 0 > a_write (desc, "", 0, XINT (start), &annotations);
3a69848f7892 (Fwrite_region): Move the code that writes annotations for empty files.
Richard M. Stallman <rms@gnu.org>
parents: 13221
diff changeset
3630 save_errno = errno;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3631 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3632
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3633 immediate_quit = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3634
2280
bd56d208ed22 * fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents: 2257
diff changeset
3635 #ifdef HAVE_FSYNC
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3636 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun).
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3637 Disk full in NFS may be reported here. */
3415
c37d05ce7e52 (Fwrite_region): Don't fsync if autosaving.
Richard M. Stallman <rms@gnu.org>
parents: 3410
diff changeset
3638 /* mib says that closing the file will try to write as fast as NFS can do
c37d05ce7e52 (Fwrite_region): Don't fsync if autosaving.
Richard M. Stallman <rms@gnu.org>
parents: 3410
diff changeset
3639 it, and that means the fsync here is not crucial for autosave files. */
c37d05ce7e52 (Fwrite_region): Don't fsync if autosaving.
Richard M. Stallman <rms@gnu.org>
parents: 3410
diff changeset
3640 if (!auto_saving && fsync (desc) < 0)
12540
1a96888d82ed (Fwrite_region): If fsync fails with EINTR, don't
Karl Heuer <kwzh@gnu.org>
parents: 12369
diff changeset
3641 {
1a96888d82ed (Fwrite_region): If fsync fails with EINTR, don't
Karl Heuer <kwzh@gnu.org>
parents: 12369
diff changeset
3642 /* If fsync fails with EINTR, don't treat that as serious. */
1a96888d82ed (Fwrite_region): If fsync fails with EINTR, don't
Karl Heuer <kwzh@gnu.org>
parents: 12369
diff changeset
3643 if (errno != EINTR)
1a96888d82ed (Fwrite_region): If fsync fails with EINTR, don't
Karl Heuer <kwzh@gnu.org>
parents: 12369
diff changeset
3644 failure = 1, save_errno = errno;
1a96888d82ed (Fwrite_region): If fsync fails with EINTR, don't
Karl Heuer <kwzh@gnu.org>
parents: 12369
diff changeset
3645 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3646 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3647
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
3648 /* Spurious "file has changed on disk" warnings have been
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3649 observed on Suns as well.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3650 It seems that `close' can change the modtime, under nfs.
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3651
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3652 (This has supposedly been fixed in Sunos 4,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3653 but who knows about all the other machines with NFS?) */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3654 #if 0
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3655
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3656 /* On VMS and APOLLO, must do the stat after the close
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3657 since closing changes the modtime. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3658 #ifndef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3659 #ifndef APOLLO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3660 /* Recall that #if defined does not work on VMS. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3661 #define FOO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3662 fstat (desc, &st);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3663 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3664 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3665 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3666
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3667 /* NFS can report a write failure now. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3668 if (close (desc) < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3669 failure = 1, save_errno = errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3670
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3671 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3672 /* If we wrote to a temporary name and had no errors, rename to real name. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3673 if (fname)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3674 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3675 if (!failure)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3676 failure = (rename (fn, fname) != 0), save_errno = errno;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3677 fn = fname;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3678 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3679 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3680
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3681 #ifndef FOO
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3682 stat (fn, &st);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3683 #endif
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3684 /* Discard the unwind protect for close_file_unwind. */
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3685 specpdl_ptr = specpdl + count1;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3686 /* Restore the original current buffer. */
8662
627a2ed242c0 (Ffile_accessible_directory_p): No need for gcpro.
Richard M. Stallman <rms@gnu.org>
parents: 8603
diff changeset
3687 visit_file = unbind_to (count, visit_file);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3688
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3689 #ifdef CLASH_DETECTION
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3690 if (!auto_saving)
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3691 unlock_file (lockname);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3692 #endif /* CLASH_DETECTION */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3693
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3694 /* Do this before reporting IO error
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3695 to avoid a "file has changed on disk" warning on
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3696 next attempt to save. */
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3697 if (visiting)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3698 current_buffer->modtime = st.st_mtime;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3699
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3700 if (failure)
5517
8b2b6a296cda Don't declare sys_errlist; declare strerror instead.
Roland McGrath <roland@gnu.org>
parents: 5494
diff changeset
3701 error ("IO error writing %s: %s", fn, strerror (save_errno));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3702
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3703 if (visiting)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3704 {
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
3705 SAVE_MODIFF = MODIFF;
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
3706 XSETFASTINT (current_buffer->save_length, Z - BEG);
1377
dcec08a3bec4 (Fwrite_region): If VISIT is a file name,
Richard M. Stallman <rms@gnu.org>
parents: 1358
diff changeset
3707 current_buffer->filename = visit_file;
7551
69f20f10799a (Fwrite_region): Set update_mode_lines.
Richard M. Stallman <rms@gnu.org>
parents: 7549
diff changeset
3708 update_mode_lines++;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3709 }
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3710 else if (quietly)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3711 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3712
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3713 if (!auto_saving)
1377
dcec08a3bec4 (Fwrite_region): If VISIT is a file name,
Richard M. Stallman <rms@gnu.org>
parents: 1358
diff changeset
3714 message ("Wrote %s", XSTRING (visit_file)->data);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3715
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3716 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3717 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3718
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3719 Lisp_Object merge ();
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3720
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3721 DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0,
4853
3ec2205d12b5 (Fcar_less_than_car): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents: 4841
diff changeset
3722 "Return t if (car A) is numerically less than (car B).")
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3723 (a, b)
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3724 Lisp_Object a, b;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3725 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3726 return Flss (Fcar (a), Fcar (b));
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3727 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3728
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3729 /* Build the complete list of annotations appropriate for writing out
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3730 the text between START and END, by calling all the functions in
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3731 write-region-annotate-functions and merging the lists they return.
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3732 If one of these functions switches to a different buffer, we assume
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3733 that buffer contains altered text. Therefore, the caller must
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3734 make sure to restore the current buffer in all cases,
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3735 as save-excursion would do. */
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3736
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3737 static Lisp_Object
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3738 build_annotations (start, end)
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3739 Lisp_Object start, end;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3740 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3741 Lisp_Object annotations;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3742 Lisp_Object p, res;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3743 struct gcpro gcpro1, gcpro2;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3744
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3745 annotations = Qnil;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3746 p = Vwrite_region_annotate_functions;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3747 GCPRO2 (annotations, p);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3748 while (!NILP (p))
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3749 {
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3750 struct buffer *given_buffer = current_buffer;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3751 Vwrite_region_annotations_so_far = annotations;
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3752 res = call2 (Fcar (p), start, end);
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3753 /* If the function makes a different buffer current,
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3754 assume that means this buffer contains altered text to be output.
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3755 Reset START and END from the buffer bounds
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3756 and discard all previous annotations because they should have
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3757 been dealt with by this function. */
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3758 if (current_buffer != given_buffer)
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3759 {
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3760 start = BEGV;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3761 end = ZV;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3762 annotations = Qnil;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
3763 }
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3764 Flength (res); /* Check basic validity of return value */
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3765 annotations = merge (annotations, res, Qcar_less_than_car);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3766 p = Fcdr (p);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3767 }
11053
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3768
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3769 /* Now do the same for annotation functions implied by the file-format */
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3770 if (auto_saving && (!EQ (Vauto_save_file_format, Qt)))
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3771 p = Vauto_save_file_format;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3772 else
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3773 p = current_buffer->file_format;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3774 while (!NILP (p))
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3775 {
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3776 struct buffer *given_buffer = current_buffer;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3777 Vwrite_region_annotations_so_far = annotations;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3778 res = call3 (Qformat_annotate_function, Fcar (p), start, end);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3779 if (current_buffer != given_buffer)
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3780 {
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3781 start = BEGV;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3782 end = ZV;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3783 annotations = Qnil;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3784 }
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3785 Flength (res);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3786 annotations = merge (annotations, res, Qcar_less_than_car);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3787 p = Fcdr (p);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
3788 }
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3789 UNGCPRO;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3790 return annotations;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3791 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3792
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3793 /* Write to descriptor DESC the LEN characters starting at ADDR,
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3794 assuming they start at position POS in the buffer.
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3795 Intersperse with them the annotations from *ANNOT
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3796 (those which fall within the range of positions POS to POS + LEN),
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3797 each at its appropriate position.
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3798
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3799 Modify *ANNOT by discarding elements as we output them.
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3800 The return value is negative in case of system call failure. */
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3801
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3802 int
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3803 a_write (desc, addr, len, pos, annot)
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3804 int desc;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3805 register char *addr;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3806 register int len;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3807 int pos;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3808 Lisp_Object *annot;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3809 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3810 Lisp_Object tem;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3811 int nextpos;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3812 int lastpos = pos + len;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3813
8079
3f543986a45a (a_write): Loop while *ANNOT is listp, not consp. Previous code omitted
Roland McGrath <roland@gnu.org>
parents: 8068
diff changeset
3814 while (NILP (*annot) || CONSP (*annot))
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3815 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3816 tem = Fcar_safe (Fcar (*annot));
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3817 if (INTEGERP (tem) && XINT (tem) >= pos && XFASTINT (tem) <= lastpos)
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3818 nextpos = XFASTINT (tem);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3819 else
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3820 return e_write (desc, addr, lastpos - pos);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3821 if (nextpos > pos)
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3822 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3823 if (0 > e_write (desc, addr, nextpos - pos))
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3824 return -1;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3825 addr += nextpos - pos;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3826 pos = nextpos;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3827 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3828 tem = Fcdr (Fcar (*annot));
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3829 if (STRINGP (tem))
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3830 {
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3831 if (0 > e_write (desc, XSTRING (tem)->data, XSTRING (tem)->size))
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3832 return -1;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3833 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3834 *annot = Fcdr (*annot);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3835 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3836 }
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
3837
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3838 int
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3839 e_write (desc, addr, len)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3840 int desc;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3841 register char *addr;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3842 register int len;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3843 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3844 char buf[16 * 1024];
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3845 register char *p, *end;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3846
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3847 if (!EQ (current_buffer->selective_display, Qt))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3848 return write (desc, addr, len) - len;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3849 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3850 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3851 p = buf;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3852 end = p + sizeof buf;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3853 while (len--)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3854 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3855 if (p == end)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3856 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3857 if (write (desc, buf, sizeof buf) != sizeof buf)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3858 return -1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3859 p = buf;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3860 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3861 *p = *addr++;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3862 if (*p++ == '\015')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3863 p[-1] = '\n';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3864 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3865 if (p != buf)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3866 if (write (desc, buf, p - buf) != p - buf)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3867 return -1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3868 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3869 return 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3870 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3871
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3872 DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3873 Sverify_visited_file_modtime, 1, 1, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3874 "Return t if last mod time of BUF's visited file matches what BUF records.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3875 This means that the file has not been changed since it was visited or saved.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3876 (buf)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3877 Lisp_Object buf;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3878 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3879 struct buffer *b;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3880 struct stat st;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3881 Lisp_Object handler;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3882
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3883 CHECK_BUFFER (buf, 0);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3884 b = XBUFFER (buf);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3885
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
3886 if (!STRINGP (b->filename)) return Qt;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3887 if (b->modtime == 0) return Qt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3888
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3889 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3890 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
3891 handler = Ffind_file_name_handler (b->filename,
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
3892 Qverify_visited_file_modtime);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3893 if (!NILP (handler))
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
3894 return call2 (handler, Qverify_visited_file_modtime, buf);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
3895
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3896 if (stat (XSTRING (b->filename)->data, &st) < 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3897 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3898 /* If the file doesn't exist now and didn't exist before,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3899 we say that it isn't modified, provided the error is a tame one. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3900 if (errno == ENOENT || errno == EACCES || errno == ENOTDIR)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3901 st.st_mtime = -1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3902 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3903 st.st_mtime = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3904 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3905 if (st.st_mtime == b->modtime
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3906 /* If both are positive, accept them if they are off by one second. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3907 || (st.st_mtime > 0 && b->modtime > 0
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3908 && (st.st_mtime == b->modtime + 1
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3909 || st.st_mtime == b->modtime - 1)))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3910 return Qt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3911 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3912 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3913
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3914 DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3915 Sclear_visited_file_modtime, 0, 0, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3916 "Clear out records of last mod time of visited file.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3917 Next attempt to save will certainly not complain of a discrepancy.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3918 ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3919 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3920 current_buffer->modtime = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3921 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3922 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3923
2257
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3924 DEFUN ("visited-file-modtime", Fvisited_file_modtime,
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3925 Svisited_file_modtime, 0, 0, 0,
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3926 "Return the current buffer's recorded visited file modification time.\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3927 The value is a list of the form (HIGH . LOW), like the time values\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3928 that `file-attributes' returns.")
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3929 ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3930 {
11878
86257fdd585c (Fvisited_file_modtime): Cast arg to long_to_cons.
Karl Heuer <kwzh@gnu.org>
parents: 11667
diff changeset
3931 return long_to_cons ((unsigned long) current_buffer->modtime);
2257
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3932 }
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3933
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3934 DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime,
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3935 Sset_visited_file_modtime, 0, 1, 0,
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3936 "Update buffer's recorded modification time from the visited file's time.\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3937 Useful if the buffer was not read from the file normally\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3938 or if the file itself has been changed for some known benign reason.\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3939 An argument specifies the modification time value to use\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3940 \(instead of that of the visited file), in the form of a list\n\
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3941 \(HIGH . LOW) or (HIGH LOW).")
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3942 (time_list)
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3943 Lisp_Object time_list;
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3944 {
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3945 if (!NILP (time_list))
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3946 current_buffer->modtime = cons_to_long (time_list);
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3947 else
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3948 {
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3949 register Lisp_Object filename;
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3950 struct stat st;
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3951 Lisp_Object handler;
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3952
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3953 filename = Fexpand_file_name (current_buffer->filename, Qnil);
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3954
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3955 /* If the file name has special constructs in it,
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3956 call the corresponding file handler. */
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
3957 handler = Ffind_file_name_handler (filename, Qset_visited_file_modtime);
2257
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3958 if (!NILP (handler))
3721
4550c56785d8 (Fset_visited_file_modtime): Don't give the handler
Richard M. Stallman <rms@gnu.org>
parents: 3705
diff changeset
3959 /* The handler can find the file name the same way we did. */
3829
4130587b6ffc * fileio.c (Fset_visited_file_modtime): We're only passing two
Jim Blandy <jimb@redhat.com>
parents: 3787
diff changeset
3960 return call2 (handler, Qset_visited_file_modtime, Qnil);
2257
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3961 else if (stat (XSTRING (filename)->data, &st) >= 0)
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3962 current_buffer->modtime = st.st_mtime;
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
3963 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3964
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3965 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3966 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3967
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3968 Lisp_Object
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3969 auto_save_error ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3970 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3971 ring_bell ();
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
3972 message ("Autosaving...error for %s", XSTRING (current_buffer->name)->data);
806
d42e1151eed8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 752
diff changeset
3973 Fsleep_for (make_number (1), Qnil);
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
3974 message ("Autosaving...error!for %s", XSTRING (current_buffer->name)->data);
806
d42e1151eed8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 752
diff changeset
3975 Fsleep_for (make_number (1), Qnil);
8602
99f6ae4160f5 (Fmake_symbolic_link, Ffile_accessible_directory_p, Finsert_file_contents,
Karl Heuer <kwzh@gnu.org>
parents: 8597
diff changeset
3976 message ("Autosaving...error for %s", XSTRING (current_buffer->name)->data);
806
d42e1151eed8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 752
diff changeset
3977 Fsleep_for (make_number (1), Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3978 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3979 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3980
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3981 Lisp_Object
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3982 auto_save_1 ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3983 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3984 unsigned char *fn;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3985 struct stat st;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3986
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3987 /* Get visited file's mode to become the auto save file's mode. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3988 if (stat (XSTRING (current_buffer->filename)->data, &st) >= 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3989 /* But make sure we can overwrite it later! */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3990 auto_save_mode_bits = st.st_mode | 0600;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3991 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3992 auto_save_mode_bits = 0666;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3993
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3994 return
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3995 Fwrite_region (Qnil, Qnil,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3996 current_buffer->auto_save_file_name,
12853
032f8aae6bbe (Fwrite_region): New arg lockname.
Richard M. Stallman <rms@gnu.org>
parents: 12642
diff changeset
3997 Qnil, Qlambda, Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3998 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3999
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4000 static Lisp_Object
7526
bf357bdc648e (Fdo_auto_save): Save listdesc as an integer, only if open.
Richard M. Stallman <rms@gnu.org>
parents: 7493
diff changeset
4001 do_auto_save_unwind (desc) /* used as unwind-protect function */
bf357bdc648e (Fdo_auto_save): Save listdesc as an integer, only if open.
Richard M. Stallman <rms@gnu.org>
parents: 7493
diff changeset
4002 Lisp_Object desc;
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4003 {
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
4004 auto_saving = 0;
14128
6b1ecb157b48 (do_auto_save_unwind): Don't close DESC if DESC < 0.
Karl Heuer <kwzh@gnu.org>
parents: 14074
diff changeset
4005 if (XINT (desc) >= 0)
6b1ecb157b48 (do_auto_save_unwind): Don't close DESC if DESC < 0.
Karl Heuer <kwzh@gnu.org>
parents: 14074
diff changeset
4006 close (XINT (desc));
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4007 return Qnil;
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4008 }
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4009
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4010 DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "",
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4011 "Auto-save all buffers that need it.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4012 This is all buffers that have auto-saving enabled\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4013 and are changed since last auto-saved.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4014 Auto-saving writes the buffer into a file\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4015 so that your editing is not lost if the system crashes.\n\
6209
2a8a76b9a2fe (Fdo_auto_save): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 6194
diff changeset
4016 This file is not the file you visited; that changes only when you save.\n\
2a8a76b9a2fe (Fdo_auto_save): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 6194
diff changeset
4017 Normally we run the normal hook `auto-save-hook' before saving.\n\n\
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4018 A non-nil NO-MESSAGE argument means do not print any message if successful.\n\
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4019 A non-nil CURRENT-ONLY argument means save only current buffer.")
1775
f9ac4c0d8b72 * fileio.c (Fdo_auto_save): Add CURRENT_ONLY argument, as
Jim Blandy <jimb@redhat.com>
parents: 1763
diff changeset
4020 (no_message, current_only)
f9ac4c0d8b72 * fileio.c (Fdo_auto_save): Add CURRENT_ONLY argument, as
Jim Blandy <jimb@redhat.com>
parents: 1763
diff changeset
4021 Lisp_Object no_message, current_only;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4022 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4023 struct buffer *old = current_buffer, *b;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4024 Lisp_Object tail, buf;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4025 int auto_saved = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4026 char *omessage = echo_area_glyphs;
5875
6bfcd23bfa84 (Fdo_auto_save): Save echo_area_glyphs_length.
Karl Heuer <kwzh@gnu.org>
parents: 5758
diff changeset
4027 int omessage_length = echo_area_glyphs_length;
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4028 extern int minibuf_level;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4029 int do_handled_files;
4270
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4030 Lisp_Object oquit;
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4031 int listdesc;
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4032 int count = specpdl_ptr - specpdl;
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4033 int *ptr;
4270
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4034
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4035 /* Ordinarily don't quit within this function,
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4036 but don't make it impossible to quit (in case we get hung in I/O). */
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4037 oquit = Vquit_flag;
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4038 Vquit_flag = Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4039
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4040 /* No GCPRO needed, because (when it matters) all Lisp_Object variables
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4041 point to non-strings reached from Vbuffer_alist. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4042
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4043 if (minibuf_level)
1775
f9ac4c0d8b72 * fileio.c (Fdo_auto_save): Add CURRENT_ONLY argument, as
Jim Blandy <jimb@redhat.com>
parents: 1763
diff changeset
4044 no_message = Qt;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4045
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4046 if (!NILP (Vrun_hooks))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4047 call1 (Vrun_hooks, intern ("auto-save-hook"));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4048
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4049 if (STRINGP (Vauto_save_list_file_name))
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4050 {
11632
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4051 Lisp_Object listfile;
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4052 listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4053 #ifdef DOS_NT
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4054 listdesc = open (XSTRING (listfile)->data,
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4055 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4056 S_IREAD | S_IWRITE);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4057 #else /* not DOS_NT */
11632
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4058 listdesc = creat (XSTRING (listfile)->data, 0666);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4059 #endif /* not DOS_NT */
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4060 }
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4061 else
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4062 listdesc = -1;
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4063
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
4064 /* Arrange to close that file whether or not we get an error.
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
4065 Also reset auto_saving to 0. */
14128
6b1ecb157b48 (do_auto_save_unwind): Don't close DESC if DESC < 0.
Karl Heuer <kwzh@gnu.org>
parents: 14074
diff changeset
4066 record_unwind_protect (do_auto_save_unwind, make_number (listdesc));
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4067
12642
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
4068 auto_saving = 1;
cdfbcff1f22a (do_auto_save_unwind): Set auto_saving to 0.
Richard M. Stallman <rms@gnu.org>
parents: 12540
diff changeset
4069
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4070 /* First, save all files which don't have handlers. If Emacs is
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4071 crashing, the handlers may tweak what is causing Emacs to crash
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4072 in the first place, and it would be a shame if Emacs failed to
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4073 autosave perfectly ordinary files because it couldn't handle some
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4074 ange-ftp'd file. */
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4075 for (do_handled_files = 0; do_handled_files < 2; do_handled_files++)
9962
72bee09fc541 (Fdo_auto_save): Use the new type-test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9955
diff changeset
4076 for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4077 {
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4078 buf = XCONS (XCONS (tail)->car)->cdr;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4079 b = XBUFFER (buf);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4080
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4081 /* Record all the buffers that have auto save mode
11632
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4082 in the special file that lists them. For each of these buffers,
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4083 Record visited name (if any) and auto save name. */
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
4084 if (STRINGP (b->auto_save_file_name)
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4085 && listdesc >= 0 && do_handled_files == 0)
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4086 {
11632
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4087 if (!NILP (b->filename))
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4088 {
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4089 write (listdesc, XSTRING (b->filename)->data,
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4090 XSTRING (b->filename)->size);
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4091 }
ddbe0702ea95 (Fdo_auto_save): Record visited file name
Richard M. Stallman <rms@gnu.org>
parents: 11599
diff changeset
4092 write (listdesc, "\n", 1);
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4093 write (listdesc, XSTRING (b->auto_save_file_name)->data,
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4094 XSTRING (b->auto_save_file_name)->size);
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4095 write (listdesc, "\n", 1);
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4096 }
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4097
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4098 if (!NILP (current_only)
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4099 && b != current_buffer)
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4100 continue;
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4101
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4102 /* Don't auto-save indirect buffers.
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4103 The base buffer takes care of it. */
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4104 if (b->base_buffer)
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4105 continue;
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4106
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4107 /* Check for auto save enabled
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4108 and file changed since last auto save
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4109 and file changed since last real save. */
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
4110 if (STRINGP (b->auto_save_file_name)
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4111 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4112 && b->auto_save_modified < BUF_MODIFF (b)
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4113 /* -1 means we've turned off autosaving for a while--see below. */
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4114 && XINT (b->save_length) >= 0
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4115 && (do_handled_files
7029
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
4116 || NILP (Ffind_file_name_handler (b->auto_save_file_name,
f67c02c50e2a (Ffind_file_name_handler): New argument OPERATION. All callers changed.
Karl Heuer <kwzh@gnu.org>
parents: 6898
diff changeset
4117 Qwrite_region))))
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4118 {
5553
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4119 EMACS_TIME before_time, after_time;
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4120
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4121 EMACS_GET_TIME (before_time);
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4122
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4123 /* If we had a failure, don't try again for 20 minutes. */
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4124 if (b->auto_save_failure_time >= 0
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4125 && EMACS_SECS (before_time) - b->auto_save_failure_time < 1200)
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4126 continue;
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4127
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4128 if ((XFASTINT (b->save_length) * 10
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4129 > (BUF_Z (b) - BUF_BEG (b)) * 13)
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4130 /* A short file is likely to change a large fraction;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4131 spare the user annoying messages. */
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4132 && XFASTINT (b->save_length) > 5000
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4133 /* These messages are frequent and annoying for `*mail*'. */
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4134 && !EQ (b->filename, Qnil)
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4135 && NILP (no_message))
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4136 {
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4137 /* It has shrunk too much; turn off auto-saving here. */
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4138 message ("Buffer %s has shrunk a lot; auto save turned off there",
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4139 XSTRING (b->name)->data);
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4140 /* Turn off auto-saving until there's a real save,
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4141 and prevent any more warnings. */
9266
811ad893828b (Fdefault_file_modes, Finsert_file_contents, Fdo_auto_save): Use new accessor
Karl Heuer <kwzh@gnu.org>
parents: 9241
diff changeset
4142 XSETINT (b->save_length, -1);
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4143 Fsleep_for (make_number (1), Qnil);
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4144 continue;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4145 }
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4146 set_buffer_internal (b);
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4147 if (!auto_saved && NILP (no_message))
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4148 message1 ("Auto-saving...");
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4149 internal_condition_case (auto_save_1, Qt, auto_save_error);
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4150 auto_saved++;
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4151 b->auto_save_modified = BUF_MODIFF (b);
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
4152 XSETFASTINT (current_buffer->save_length, Z - BEG);
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4153 set_buffer_internal (old);
5553
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4154
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4155 EMACS_GET_TIME (after_time);
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4156
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4157 /* If auto-save took more than 60 seconds,
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4158 assume it was an NFS failure that got a timeout. */
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4159 if (EMACS_SECS (after_time) - EMACS_SECS (before_time) > 60)
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4160 b->auto_save_failure_time = EMACS_SECS (after_time);
1869
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4161 }
30eb06b22ae4 * fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell
Jim Blandy <jimb@redhat.com>
parents: 1775
diff changeset
4162 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4163
1059
430923239064 (Fdo_auto_save): Always call record_auto_save.
Richard M. Stallman <rms@gnu.org>
parents: 1044
diff changeset
4164 /* Prevent another auto save till enough input events come in. */
430923239064 (Fdo_auto_save): Always call record_auto_save.
Richard M. Stallman <rms@gnu.org>
parents: 1044
diff changeset
4165 record_auto_save ();
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4166
1775
f9ac4c0d8b72 * fileio.c (Fdo_auto_save): Add CURRENT_ONLY argument, as
Jim Blandy <jimb@redhat.com>
parents: 1763
diff changeset
4167 if (auto_saved && NILP (no_message))
5875
6bfcd23bfa84 (Fdo_auto_save): Save echo_area_glyphs_length.
Karl Heuer <kwzh@gnu.org>
parents: 5758
diff changeset
4168 {
6bfcd23bfa84 (Fdo_auto_save): Save echo_area_glyphs_length.
Karl Heuer <kwzh@gnu.org>
parents: 5758
diff changeset
4169 if (omessage)
14616
051d6225ca90 (Fdo_auto_save): Pause before restoring old message.
Karl Heuer <kwzh@gnu.org>
parents: 14571
diff changeset
4170 {
051d6225ca90 (Fdo_auto_save): Pause before restoring old message.
Karl Heuer <kwzh@gnu.org>
parents: 14571
diff changeset
4171 sit_for (1, 0, 0, 0);
051d6225ca90 (Fdo_auto_save): Pause before restoring old message.
Karl Heuer <kwzh@gnu.org>
parents: 14571
diff changeset
4172 message2 (omessage, omessage_length);
051d6225ca90 (Fdo_auto_save): Pause before restoring old message.
Karl Heuer <kwzh@gnu.org>
parents: 14571
diff changeset
4173 }
5875
6bfcd23bfa84 (Fdo_auto_save): Save echo_area_glyphs_length.
Karl Heuer <kwzh@gnu.org>
parents: 5758
diff changeset
4174 else
6bfcd23bfa84 (Fdo_auto_save): Save echo_area_glyphs_length.
Karl Heuer <kwzh@gnu.org>
parents: 5758
diff changeset
4175 message1 ("Auto-saving...done");
6bfcd23bfa84 (Fdo_auto_save): Save echo_area_glyphs_length.
Karl Heuer <kwzh@gnu.org>
parents: 5758
diff changeset
4176 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4177
4270
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4178 Vquit_flag = oquit;
3ce8e11f338b (Fdo_auto_save): Temporarily clear Vquit_flag.
Richard M. Stallman <rms@gnu.org>
parents: 3963
diff changeset
4179
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4180 unbind_to (count, Qnil);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4181 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4182 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4183
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4184 DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4185 Sset_buffer_auto_saved, 0, 0, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4186 "Mark current buffer as auto-saved with its current text.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4187 No auto-save file will be written until the buffer changes again.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4188 ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4189 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4190 current_buffer->auto_save_modified = MODIFF;
9307
44d6fc4b638b (Finsert_file_contents, Fwrite_region, Fdo_auto_save, Fset_buffer_auto_saved):
Karl Heuer <kwzh@gnu.org>
parents: 9291
diff changeset
4191 XSETFASTINT (current_buffer->save_length, Z - BEG);
5553
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4192 current_buffer->auto_save_failure_time = -1;
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4193 return Qnil;
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4194 }
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4195
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4196 DEFUN ("clear-buffer-auto-save-failure", Fclear_buffer_auto_save_failure,
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4197 Sclear_buffer_auto_save_failure, 0, 0, 0,
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4198 "Clear any record of a recent auto-save failure in the current buffer.")
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4199 ()
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4200 {
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4201 current_buffer->auto_save_failure_time = -1;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4202 return Qnil;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4203 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4204
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4205 DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4206 0, 0, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4207 "Return t if buffer has been auto-saved since last read in or saved.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4208 ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4209 {
10304
ce5ab980a14f Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10084
diff changeset
4210 return (SAVE_MODIFF < current_buffer->auto_save_modified) ? Qt : Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4211 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4212
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4213 /* Reading and completing file names */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4214 extern Lisp_Object Ffile_name_completion (), Ffile_name_all_completions ();
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4215
5647
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4216 /* In the string VAL, change each $ to $$ and return the result. */
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4217
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4218 static Lisp_Object
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4219 double_dollars (val)
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4220 Lisp_Object val;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4221 {
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4222 register unsigned char *old, *new;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4223 register int n;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4224 int osize, count;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4225
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4226 osize = XSTRING (val)->size;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4227 /* Quote "$" as "$$" to get it past substitute-in-file-name */
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4228 for (n = osize, count = 0, old = XSTRING (val)->data; n > 0; n--)
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4229 if (*old++ == '$') count++;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4230 if (count > 0)
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4231 {
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4232 old = XSTRING (val)->data;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4233 val = Fmake_string (make_number (osize + count), make_number (0));
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4234 new = XSTRING (val)->data;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4235 for (n = osize; n > 0; n--)
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4236 if (*old != '$')
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4237 *new++ = *old++;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4238 else
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4239 {
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4240 *new++ = '$';
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4241 *new++ = '$';
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4242 old++;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4243 }
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4244 }
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4245 return val;
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4246 }
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4247
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4248 DEFUN ("read-file-name-internal", Fread_file_name_internal, Sread_file_name_internal,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4249 3, 3, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4250 "Internal subroutine for read-file-name. Do not call this.")
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4251 (string, dir, action)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4252 Lisp_Object string, dir, action;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4253 /* action is nil for complete, t for return list of completions,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4254 lambda for verify final value */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4255 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4256 Lisp_Object name, specdir, realdir, val, orig_string;
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4257 int changed;
9955
dfb5d7e86733 (Fread_file_name_internal): Protect orig_string.
Richard M. Stallman <rms@gnu.org>
parents: 9921
diff changeset
4258 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4259
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4260 realdir = dir;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4261 name = string;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4262 orig_string = Qnil;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4263 specdir = Qnil;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4264 changed = 0;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4265 /* No need to protect ACTION--we only compare it with t and nil. */
9955
dfb5d7e86733 (Fread_file_name_internal): Protect orig_string.
Richard M. Stallman <rms@gnu.org>
parents: 9921
diff changeset
4266 GCPRO5 (string, realdir, name, specdir, orig_string);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4267
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4268 if (XSTRING (string)->size == 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4269 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4270 if (EQ (action, Qlambda))
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4271 {
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4272 UNGCPRO;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4273 return Qnil;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4274 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4275 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4276 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4277 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4278 orig_string = string;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4279 string = Fsubstitute_in_file_name (string);
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4280 changed = NILP (Fstring_equal (string, orig_string));
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4281 name = Ffile_name_nondirectory (string);
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4282 val = Ffile_name_directory (string);
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4283 if (! NILP (val))
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4284 realdir = Fexpand_file_name (val, realdir);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4285 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4286
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4287 if (NILP (action))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4288 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4289 specdir = Ffile_name_directory (string);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4290 val = Ffile_name_completion (name, realdir);
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4291 UNGCPRO;
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
4292 if (!STRINGP (val))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4293 {
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4294 if (changed)
8454
b09c4b7a4729 (Fread_file_name_internal): Call double_dollars when `changed' is set.
Richard M. Stallman <rms@gnu.org>
parents: 8317
diff changeset
4295 return double_dollars (string);
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4296 return val;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4297 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4298
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4299 if (!NILP (specdir))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4300 val = concat2 (specdir, val);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4301 #ifndef VMS
5647
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4302 return double_dollars (val);
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4303 #else /* not VMS */
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4304 return val;
5647
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4305 #endif /* not VMS */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4306 }
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4307 UNGCPRO;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4308
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4309 if (EQ (action, Qt))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4310 return Ffile_name_all_completions (name, realdir);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4311 /* Only other case actually used is ACTION = lambda */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4312 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4313 /* Supposedly this helps commands such as `cd' that read directory names,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4314 but can someone explain how it helps them? -- RMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4315 if (XSTRING (name)->size == 0)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4316 return Qt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4317 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4318 return Ffile_exists_p (string);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4319 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4320
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4321 DEFUN ("read-file-name", Fread_file_name, Sread_file_name, 1, 5, 0,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4322 "Read file name, prompting with PROMPT and completing in directory DIR.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4323 Value is not expanded---you must call `expand-file-name' yourself.\n\
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4324 Default name to DEFAULT-FILENAME if user enters a null string.\n\
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4325 (If DEFAULT-FILENAME is omitted, the visited file name is used,\n\
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
4326 except that if INITIAL is specified, that combined with DIR is used.)\n\
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4327 Fourth arg MUSTMATCH non-nil means require existing file's name.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4328 Non-nil and non-t means also require confirmation after completion.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4329 Fifth arg INITIAL specifies text to start with.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4330 DIR defaults to current buffer's directory default.")
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4331 (prompt, dir, default_filename, mustmatch, initial)
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4332 Lisp_Object prompt, dir, default_filename, mustmatch, initial;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4333 {
866
ae5c412a32ec entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 863
diff changeset
4334 Lisp_Object val, insdef, insdef1, tem;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4335 struct gcpro gcpro1, gcpro2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4336 register char *homedir;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4337 int count;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4338
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4339 if (NILP (dir))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4340 dir = current_buffer->directory;
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4341 if (NILP (default_filename))
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
4342 {
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
4343 if (! NILP (initial))
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4344 default_filename = Fexpand_file_name (initial, dir);
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
4345 else
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4346 default_filename = current_buffer->filename;
9078
283534a85f5a (Ffile_writable_p): Use stat to test for existence.
Richard M. Stallman <rms@gnu.org>
parents: 8885
diff changeset
4347 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4348
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4349 /* If dir starts with user's homedir, change that to ~. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4350 homedir = (char *) egetenv ("HOME");
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4351 #ifdef DOS_NT
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4352 homedir = strcpy (alloca (strlen (homedir) + 1), homedir);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4353 CORRECT_DIR_SEPS (homedir);
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4354 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4355 if (homedir != 0
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
4356 && STRINGP (dir)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4357 && !strncmp (homedir, XSTRING (dir)->data, strlen (homedir))
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4358 && IS_DIRECTORY_SEP (XSTRING (dir)->data[strlen (homedir)]))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4359 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4360 dir = make_string (XSTRING (dir)->data + strlen (homedir) - 1,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4361 XSTRING (dir)->size - strlen (homedir) + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4362 XSTRING (dir)->data[0] = '~';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4363 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4364
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4365 if (insert_default_directory)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4366 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4367 insdef = dir;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4368 if (!NILP (initial))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4369 {
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4370 Lisp_Object args[2], pos;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4371
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4372 args[0] = insdef;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4373 args[1] = initial;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4374 insdef = Fconcat (2, args);
6181
dd271c6b4e56 (Fread_file_name): Do the right thing when insert-default-directory is nil.
Karl Heuer <kwzh@gnu.org>
parents: 6177
diff changeset
4375 pos = make_number (XSTRING (double_dollars (dir))->size);
5647
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4376 insdef1 = Fcons (double_dollars (insdef), pos);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4377 }
5647
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4378 else
7bd40f51b9e9 (double_dollars): New function.
Richard M. Stallman <rms@gnu.org>
parents: 5616
diff changeset
4379 insdef1 = double_dollars (insdef);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4380 }
6181
dd271c6b4e56 (Fread_file_name): Do the right thing when insert-default-directory is nil.
Karl Heuer <kwzh@gnu.org>
parents: 6177
diff changeset
4381 else if (!NILP (initial))
dd271c6b4e56 (Fread_file_name): Do the right thing when insert-default-directory is nil.
Karl Heuer <kwzh@gnu.org>
parents: 6177
diff changeset
4382 {
dd271c6b4e56 (Fread_file_name): Do the right thing when insert-default-directory is nil.
Karl Heuer <kwzh@gnu.org>
parents: 6177
diff changeset
4383 insdef = initial;
dd271c6b4e56 (Fread_file_name): Do the right thing when insert-default-directory is nil.
Karl Heuer <kwzh@gnu.org>
parents: 6177
diff changeset
4384 insdef1 = Fcons (double_dollars (insdef), 0);
dd271c6b4e56 (Fread_file_name): Do the right thing when insert-default-directory is nil.
Karl Heuer <kwzh@gnu.org>
parents: 6177
diff changeset
4385 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4386 else
866
ae5c412a32ec entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 863
diff changeset
4387 insdef = Qnil, insdef1 = Qnil;
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4388
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4389 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4390 count = specpdl_ptr - specpdl;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4391 specbind (intern ("completion-ignore-case"), Qt);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4392 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4393
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4394 GCPRO2 (insdef, default_filename);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4395 val = Fcompleting_read (prompt, intern ("read-file-name-internal"),
866
ae5c412a32ec entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 863
diff changeset
4396 dir, mustmatch, insdef1,
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4397 Qfile_name_history);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4398
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4399 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4400 unbind_to (count, Qnil);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4401 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4402
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4403 UNGCPRO;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4404 if (NILP (val))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4405 error ("No file name specified");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4406 tem = Fstring_equal (val, insdef);
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4407 if (!NILP (tem) && !NILP (default_filename))
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4408 return default_filename;
3032
371058345c42 (Fread_file_name): If input is empty, do return the default
Richard M. Stallman <rms@gnu.org>
parents: 3017
diff changeset
4409 if (XSTRING (val)->size == 0 && NILP (insdef))
5245
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
4410 {
14074
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4411 if (!NILP (default_filename))
f15db8536fdd (Ffile_name_directory, Ffile_name_nondirectory, Ffile_name_as_directory,
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
4412 return default_filename;
5245
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
4413 else
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
4414 error ("No default file name");
4a9b93b0eac3 (Fmake_symbolic_link): Do expand FILENAME if starts with ~.
Richard M. Stallman <rms@gnu.org>
parents: 5129
diff changeset
4415 }
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4416 return Fsubstitute_in_file_name (val);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4417 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4418
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4419 #if 0 /* Old version */
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4420 DEFUN ("read-file-name", Fread_file_name, Sread_file_name, 1, 5, 0,
6347
c7e1f551e97a (Fread_file_name): Delete docstring of second version of function, to avoid
Karl Heuer <kwzh@gnu.org>
parents: 6328
diff changeset
4421 /* Don't confuse make-docfile by having two doc strings for this function.
c7e1f551e97a (Fread_file_name): Delete docstring of second version of function, to avoid
Karl Heuer <kwzh@gnu.org>
parents: 6328
diff changeset
4422 make-docfile does not pay attention to #if, for good reason! */
c7e1f551e97a (Fread_file_name): Delete docstring of second version of function, to avoid
Karl Heuer <kwzh@gnu.org>
parents: 6328
diff changeset
4423 0)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4424 (prompt, dir, defalt, mustmatch, initial)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4425 Lisp_Object prompt, dir, defalt, mustmatch, initial;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4426 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4427 Lisp_Object val, insdef, tem;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4428 struct gcpro gcpro1, gcpro2;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4429 register char *homedir;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4430 int count;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4431
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4432 if (NILP (dir))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4433 dir = current_buffer->directory;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4434 if (NILP (defalt))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4435 defalt = current_buffer->filename;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4436
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4437 /* If dir starts with user's homedir, change that to ~. */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4438 homedir = (char *) egetenv ("HOME");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4439 if (homedir != 0
9131
2190d1e7a69f (Ffind_file_name_handler, Fcopy_file, Frename_file, Fadd_name_to_file,
Karl Heuer <kwzh@gnu.org>
parents: 9078
diff changeset
4440 && STRINGP (dir)
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4441 && !strncmp (homedir, XSTRING (dir)->data, strlen (homedir))
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4442 && XSTRING (dir)->data[strlen (homedir)] == '/')
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4443 {
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4444 dir = make_string (XSTRING (dir)->data + strlen (homedir) - 1,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4445 XSTRING (dir)->size - strlen (homedir) + 1);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4446 XSTRING (dir)->data[0] = '~';
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4447 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4448
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4449 if (!NILP (initial))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4450 insdef = initial;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4451 else if (insert_default_directory)
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4452 insdef = dir;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4453 else
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4454 insdef = build_string ("");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4455
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4456 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4457 count = specpdl_ptr - specpdl;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4458 specbind (intern ("completion-ignore-case"), Qt);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4459 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4460
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4461 GCPRO2 (insdef, defalt);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4462 val = Fcompleting_read (prompt, intern ("read-file-name-internal"),
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4463 dir, mustmatch,
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4464 insert_default_directory ? insdef : Qnil,
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4465 Qfile_name_history);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4466
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4467 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4468 unbind_to (count, Qnil);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4469 #endif
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4470
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4471 UNGCPRO;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4472 if (NILP (val))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4473 error ("No file name specified");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4474 tem = Fstring_equal (val, insdef);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 410
diff changeset
4475 if (!NILP (tem) && !NILP (defalt))
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4476 return defalt;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4477 return Fsubstitute_in_file_name (val);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4478 }
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4479 #endif /* Old version */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4480
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4481 syms_of_fileio ()
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4482 {
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
4483 Qexpand_file_name = intern ("expand-file-name");
10719
40ae63b409f4 (Fexpand_file_name): Look for a handler for defalt.
Richard M. Stallman <rms@gnu.org>
parents: 10499
diff changeset
4484 Qsubstitute_in_file_name = intern ("substitute-in-file-name");
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
4485 Qdirectory_file_name = intern ("directory-file-name");
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
4486 Qfile_name_directory = intern ("file-name-directory");
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
4487 Qfile_name_nondirectory = intern ("file-name-nondirectory");
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4488 Qunhandled_file_name_directory = intern ("unhandled-file-name-directory");
1105
80ad8d0704ba (Ffile_name_directory, Ffile_name_nondirectory):
Richard M. Stallman <rms@gnu.org>
parents: 1071
diff changeset
4489 Qfile_name_as_directory = intern ("file-name-as-directory");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4490 Qcopy_file = intern ("copy-file");
8227
0e6b7eeedc3b (Fmake_directory_internal): Use Qmake_directory_internal.
Richard M. Stallman <rms@gnu.org>
parents: 8185
diff changeset
4491 Qmake_directory_internal = intern ("make-directory-internal");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4492 Qdelete_directory = intern ("delete-directory");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4493 Qdelete_file = intern ("delete-file");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4494 Qrename_file = intern ("rename-file");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4495 Qadd_name_to_file = intern ("add-name-to-file");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4496 Qmake_symbolic_link = intern ("make-symbolic-link");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4497 Qfile_exists_p = intern ("file-exists-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4498 Qfile_executable_p = intern ("file-executable-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4499 Qfile_readable_p = intern ("file-readable-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4500 Qfile_symlink_p = intern ("file-symlink-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4501 Qfile_writable_p = intern ("file-writable-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4502 Qfile_directory_p = intern ("file-directory-p");
11599
51bc10be0dc7 (Ffile_regular_p): Use Qfile_regular_p.
Richard M. Stallman <rms@gnu.org>
parents: 11426
diff changeset
4503 Qfile_regular_p = intern ("file-regular-p");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4504 Qfile_accessible_directory_p = intern ("file-accessible-directory-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4505 Qfile_modes = intern ("file-modes");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4506 Qset_file_modes = intern ("set-file-modes");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4507 Qfile_newer_than_file_p = intern ("file-newer-than-file-p");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4508 Qinsert_file_contents = intern ("insert-file-contents");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4509 Qwrite_region = intern ("write-region");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4510 Qverify_visited_file_modtime = intern ("verify-visited-file-modtime");
3560
95021dcb923b (syms_of_fileio): Set up Qset_visited_file_modtime.
Richard M. Stallman <rms@gnu.org>
parents: 3415
diff changeset
4511 Qset_visited_file_modtime = intern ("set-visited-file-modtime");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 806
diff changeset
4512
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4513 staticpro (&Qexpand_file_name);
10719
40ae63b409f4 (Fexpand_file_name): Look for a handler for defalt.
Richard M. Stallman <rms@gnu.org>
parents: 10499
diff changeset
4514 staticpro (&Qsubstitute_in_file_name);
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4515 staticpro (&Qdirectory_file_name);
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4516 staticpro (&Qfile_name_directory);
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4517 staticpro (&Qfile_name_nondirectory);
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4518 staticpro (&Qunhandled_file_name_directory);
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4519 staticpro (&Qfile_name_as_directory);
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4520 staticpro (&Qcopy_file);
8243
bf7b3b969ab5 (syms_of_fileio): Finish previous change.
Richard M. Stallman <rms@gnu.org>
parents: 8227
diff changeset
4521 staticpro (&Qmake_directory_internal);
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4522 staticpro (&Qdelete_directory);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4523 staticpro (&Qdelete_file);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4524 staticpro (&Qrename_file);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4525 staticpro (&Qadd_name_to_file);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4526 staticpro (&Qmake_symbolic_link);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4527 staticpro (&Qfile_exists_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4528 staticpro (&Qfile_executable_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4529 staticpro (&Qfile_readable_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4530 staticpro (&Qfile_symlink_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4531 staticpro (&Qfile_writable_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4532 staticpro (&Qfile_directory_p);
11599
51bc10be0dc7 (Ffile_regular_p): Use Qfile_regular_p.
Richard M. Stallman <rms@gnu.org>
parents: 11426
diff changeset
4533 staticpro (&Qfile_regular_p);
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4534 staticpro (&Qfile_accessible_directory_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4535 staticpro (&Qfile_modes);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4536 staticpro (&Qset_file_modes);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4537 staticpro (&Qfile_newer_than_file_p);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4538 staticpro (&Qinsert_file_contents);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4539 staticpro (&Qwrite_region);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4540 staticpro (&Qverify_visited_file_modtime);
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4541
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4542 Qfile_name_history = intern ("file-name-history");
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4543 Fset (Qfile_name_history, Qnil);
863
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4544 staticpro (&Qfile_name_history);
427299469901 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 853
diff changeset
4545
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4546 Qfile_error = intern ("file-error");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4547 staticpro (&Qfile_error);
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4548 Qfile_already_exists = intern ("file-already-exists");
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4549 staticpro (&Qfile_already_exists);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4550
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4551 #ifdef DOS_NT
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
4552 Qfind_buffer_file_type = intern ("find-buffer-file-type");
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
4553 staticpro (&Qfind_buffer_file_type);
9789
a1e6724db219 Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents: 9572
diff changeset
4554 #endif /* DOS_NT */
5494
1ea2b4351945 [MSDOS]: #include "msdos.h" and <sys/param.h> needed for
Richard M. Stallman <rms@gnu.org>
parents: 5410
diff changeset
4555
11053
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4556 DEFVAR_LISP ("auto-save-file-format", &Vauto_save_file_format,
11090
290c241031e9 (syms_of_fileio): Fix missing \n\.
Karl Heuer <kwzh@gnu.org>
parents: 11053
diff changeset
4557 "*Format in which to write auto-save files.\n\
11053
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4558 Should be a list of symbols naming formats that are defined in `format-alist'.\n\
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4559 If it is t, which is the default, auto-save files are written in the\n\
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4560 same format as a regular save would use.");
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4561 Vauto_save_file_format = Qt;
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4562
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4563 Qformat_decode = intern ("format-decode");
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4564 staticpro (&Qformat_decode);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4565 Qformat_annotate_function = intern ("format-annotate-function");
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4566 staticpro (&Qformat_annotate_function);
f14a518fcb33 (Finsert_file_contents): Call format-decode.
Boris Goldowsky <boris@gnu.org>
parents: 10734
diff changeset
4567
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4568 Qcar_less_than_car = intern ("car-less-than-car");
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4569 staticpro (&Qcar_less_than_car);
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4570
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4571 Fput (Qfile_error, Qerror_conditions,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4572 Fcons (Qfile_error, Fcons (Qerror, Qnil)));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4573 Fput (Qfile_error, Qerror_message,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4574 build_string ("File error"));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4575
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4576 Fput (Qfile_already_exists, Qerror_conditions,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4577 Fcons (Qfile_already_exists,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4578 Fcons (Qfile_error, Fcons (Qerror, Qnil))));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4579 Fput (Qfile_already_exists, Qerror_message,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4580 build_string ("File already exists"));
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4581
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4582 DEFVAR_BOOL ("insert-default-directory", &insert_default_directory,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4583 "*Non-nil means when reading a filename start with default dir in minibuffer.");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4584 insert_default_directory = 1;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4585
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4586 DEFVAR_BOOL ("vms-stmlf-recfm", &vms_stmlf_recfm,
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4587 "*Non-nil means write new files with record format `stmlf'.\n\
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4588 nil means use format `var'. This variable is meaningful only on VMS.");
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4589 vms_stmlf_recfm = 0;
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4590
15097
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4591 DEFVAR_LISP ("directory-sep-char", &Vdirectory_sep_char,
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4592 "Directory separator character for built-in functions that return file names.\n\
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4593 The value should be either ?/ or ?\\ (any other value is treated as ?\\).\n\
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4594 This variable affects the built-in functions only on Windows,\n\
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4595 on other platforms, it is initialized so that Lisp code can find out\n\
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4596 what the normal separator is.");
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4597 Vdirectory_sep_char = '/';
32c26cb9e078 (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 15072
diff changeset
4598
850
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4599 DEFVAR_LISP ("file-name-handler-alist", &Vfile_name_handler_alist,
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4600 "*Alist of elements (REGEXP . HANDLER) for file names handled specially.\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4601 If a file name matches REGEXP, then all I/O on that file is done by calling\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4602 HANDLER.\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4603 \n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4604 The first argument given to HANDLER is the name of the I/O primitive\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4605 to be handled; the remaining arguments are the arguments that were\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4606 passed to that primitive. For example, if you do\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4607 (file-exists-p FILENAME)\n\
0bc61321ba50 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
4608 and FILENAME is handled by HANDLER, then HANDLER is called like this:\n\
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4609 (funcall HANDLER 'file-exists-p FILENAME)\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4610 The function `find-file-name-handler' checks this list for a handler\n\
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4611 for its argument.");
1178
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4612 Vfile_name_handler_alist = Qnil;
fb4ec23ef80f Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents: 1105
diff changeset
4613
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4614 DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions,
4989
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4615 "A list of functions to be called at the end of `insert-file-contents'.\n\
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4616 Each is passed one argument, the number of bytes inserted. It should return\n\
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4617 the new byte count, and leave point the same. If `insert-file-contents' is\n\
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4618 intercepted by a handler from `file-name-handler-alist', that handler is\n\
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4619 responsible for calling the after-insert-file-functions if appropriate.");
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4620 Vafter_insert_file_functions = Qnil;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4621
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4622 DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions,
4989
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4623 "A list of functions to be called at the start of `write-region'.\n\
15072
ff25c6944c3d (syms_of_fileio): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14973
diff changeset
4624 Each is passed two arguments, START and END as for `write-region'.\n\
ff25c6944c3d (syms_of_fileio): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14973
diff changeset
4625 These are usually two numbers but not always; see the documentation\n\
ff25c6944c3d (syms_of_fileio): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14973
diff changeset
4626 for `write-region'. The function should return a list of pairs\n\
ff25c6944c3d (syms_of_fileio): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14973
diff changeset
4627 of the form (POSITION . STRING), consisting of strings to be effectively\n\
4989
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4628 inserted at the specified positions of the file being written (1 means to\n\
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4629 insert before the first byte written). The POSITIONs must be sorted into\n\
9fe45f58189f (syms_of_fileio): Fix missing \n\'s.
Richard M. Stallman <rms@gnu.org>
parents: 4950
diff changeset
4630 increasing order. If there are several functions in the list, the several\n\
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4631 lists are merged destructively.");
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4632 Vwrite_region_annotate_functions = Qnil;
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4633
8317
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4634 DEFVAR_LISP ("write-region-annotations-so-far",
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4635 &Vwrite_region_annotations_so_far,
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4636 "When an annotation function is called, this holds the previous annotations.\n\
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4637 These are the annotations made by other annotation functions\n\
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4638 that were already called. See also `write-region-annotate-functions'.");
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4639 Vwrite_region_annotations_so_far = Qnil;
c59be9428778 (Fwrite_region): Do unwind the new unwind protect.
Richard M. Stallman <rms@gnu.org>
parents: 8243
diff changeset
4640
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4641 DEFVAR_LISP ("inhibit-file-name-handlers", &Vinhibit_file_name_handlers,
7549
ccb8b7f8dce7 (syms_of_fileio): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 7526
diff changeset
4642 "A list of file name handlers that temporarily should not be used.\n\
7182
f0ecad45bb35 (inhibit-file-name-handers): Correct documentation.
Richard M. Stallman <rms@gnu.org>
parents: 7130
diff changeset
4643 This applies only to the operation `inhibit-file-name-operation'.");
6678
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4644 Vinhibit_file_name_handlers = Qnil;
e29adbacde1d (Fdo_auto_save): Don't turn off auto save mode.
Richard M. Stallman <rms@gnu.org>
parents: 6498
diff changeset
4645
7041
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
4646 DEFVAR_LISP ("inhibit-file-name-operation", &Vinhibit_file_name_operation,
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
4647 "The operation for which `inhibit-file-name-handlers' is applicable.");
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
4648 Vinhibit_file_name_operation = Qnil;
7b8c405c910a (syms_of_fileio): New Lisp var inhibit-file-name-operation.
Richard M. Stallman <rms@gnu.org>
parents: 7029
diff changeset
4649
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4650 DEFVAR_LISP ("auto-save-list-file-name", &Vauto_save_list_file_name,
13769
a17778d3f5f3 (syms_of_fileio): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13541
diff changeset
4651 "File name in which we write a list of all auto save file names.\n\
a17778d3f5f3 (syms_of_fileio): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13541
diff changeset
4652 This variable is initialized automatically from `auto-save-list-file-prefix'\n\
a17778d3f5f3 (syms_of_fileio): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13541
diff changeset
4653 shortly after Emacs reads your `.emacs' file, if you have not yet given it\n\
a17778d3f5f3 (syms_of_fileio): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13541
diff changeset
4654 a non-nil value.");
7445
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4655 Vauto_save_list_file_name = Qnil;
c9942f71e2e9 (Finsert_file_contents) [MSDOS]: Ignore the replace feature.
Richard M. Stallman <rms@gnu.org>
parents: 7182
diff changeset
4656
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4657 defsubr (&Sfind_file_name_handler);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4658 defsubr (&Sfile_name_directory);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4659 defsubr (&Sfile_name_nondirectory);
1679
cd48b2c1a7a4 Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents: 1589
diff changeset
4660 defsubr (&Sunhandled_file_name_directory);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4661 defsubr (&Sfile_name_as_directory);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4662 defsubr (&Sdirectory_file_name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4663 defsubr (&Smake_temp_name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4664 defsubr (&Sexpand_file_name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4665 defsubr (&Ssubstitute_in_file_name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4666 defsubr (&Scopy_file);
1533
b86ef0432100 (Fmake_directory_internal): Renamed from Fmake_directory.
Richard M. Stallman <rms@gnu.org>
parents: 1377
diff changeset
4667 defsubr (&Smake_directory_internal);
686
bd3068742807 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 648
diff changeset
4668 defsubr (&Sdelete_directory);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4669 defsubr (&Sdelete_file);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4670 defsubr (&Srename_file);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4671 defsubr (&Sadd_name_to_file);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4672 #ifdef S_IFLNK
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4673 defsubr (&Smake_symbolic_link);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4674 #endif /* S_IFLNK */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4675 #ifdef VMS
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4676 defsubr (&Sdefine_logical_name);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4677 #endif /* VMS */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4678 #ifdef HPUX_NET
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4679 defsubr (&Ssysnetunam);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4680 #endif /* HPUX_NET */
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4681 defsubr (&Sfile_name_absolute_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4682 defsubr (&Sfile_exists_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4683 defsubr (&Sfile_executable_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4684 defsubr (&Sfile_readable_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4685 defsubr (&Sfile_writable_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4686 defsubr (&Sfile_symlink_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4687 defsubr (&Sfile_directory_p);
536
55d0073987d4 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
4688 defsubr (&Sfile_accessible_directory_p);
9346
fec27dfc0684 (Ffile_regular_p): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9307
diff changeset
4689 defsubr (&Sfile_regular_p);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4690 defsubr (&Sfile_modes);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4691 defsubr (&Sset_file_modes);
1763
65e858c07a8b (Fset_default_file_modes, Fdefault_file_modes): Renamed from .._mode.
Richard M. Stallman <rms@gnu.org>
parents: 1762
diff changeset
4692 defsubr (&Sset_default_file_modes);
65e858c07a8b (Fset_default_file_modes, Fdefault_file_modes): Renamed from .._mode.
Richard M. Stallman <rms@gnu.org>
parents: 1762
diff changeset
4693 defsubr (&Sdefault_file_modes);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4694 defsubr (&Sfile_newer_than_file_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4695 defsubr (&Sinsert_file_contents);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4696 defsubr (&Swrite_region);
4841
8800a7377ceb (Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
4697 defsubr (&Scar_less_than_car);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4698 defsubr (&Sverify_visited_file_modtime);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4699 defsubr (&Sclear_visited_file_modtime);
2257
668491072928 (Fvisited_file_modtime): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2236
diff changeset
4700 defsubr (&Svisited_file_modtime);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4701 defsubr (&Sset_visited_file_modtime);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4702 defsubr (&Sdo_auto_save);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4703 defsubr (&Sset_buffer_auto_saved);
5553
22a65d8c0b9a (Fdo_auto_save): If auto save times out, don't try again for 20 minutes.
Richard M. Stallman <rms@gnu.org>
parents: 5529
diff changeset
4704 defsubr (&Sclear_buffer_auto_save_failure);
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4705 defsubr (&Srecent_auto_save_p);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4706
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4707 defsubr (&Sread_file_name_internal);
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4708 defsubr (&Sread_file_name);
689
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
4709
1204
567860ca77e0 * fileio.c (syms_of_fileio): Don't try to defsubr Sunix_sync
Jim Blandy <jimb@redhat.com>
parents: 1178
diff changeset
4710 #ifdef unix
689
45401d45581d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 686
diff changeset
4711 defsubr (&Sunix_sync);
1204
567860ca77e0 * fileio.c (syms_of_fileio): Don't try to defsubr Sunix_sync
Jim Blandy <jimb@redhat.com>
parents: 1178
diff changeset
4712 #endif
230
5eb609139f6f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4713 }