Mercurial > emacs
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 |
rev | line source |
---|---|
230 | 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 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
621 | 8 the Free Software Foundation; either version 2, or (at your option) |
230 | 9 any later version. |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
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 | 20 |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4483
diff
changeset
|
21 #include <config.h> |
230 | 22 |
23 #include <sys/types.h> | |
24 #include <sys/stat.h> | |
372 | 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 | 38 #ifdef VMS |
564 | 39 #include "vms-pwd.h" |
372 | 40 #else |
230 | 41 #include <pwd.h> |
372 | 42 #endif |
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 | 53 #include <ctype.h> |
372 | 54 |
55 #ifdef VMS | |
5877 | 56 #include "vmsdir.h" |
372 | 57 #include <perror.h> |
58 #include <stddef.h> | |
59 #include <string.h> | |
60 #endif | |
61 | |
230 | 62 #include <errno.h> |
63 | |
372 | 64 #ifndef vax11c |
230 | 65 extern int errno; |
66 #endif | |
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 | 69 |
70 #ifdef APOLLO | |
71 #include <sys/time.h> | |
72 #endif | |
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 | 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 | 86 #include "buffer.h" |
87 #include "window.h" | |
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 | 111 #ifdef VMS |
112 #include <file.h> | |
113 #include <rmsdef.h> | |
114 #include <fab.h> | |
115 #include <nam.h> | |
116 #endif | |
117 | |
564 | 118 #include "systime.h" |
230 | 119 |
120 #ifdef HPUX | |
121 #include <netio.h> | |
350 | 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 | 124 #include <errnet.h> |
125 #endif | |
350 | 126 #endif |
3410
47b51faf6c4e
[HPUX9]: Don't include errnet.h.
Richard M. Stallman <rms@gnu.org>
parents:
3032
diff
changeset
|
127 #endif |
230 | 128 |
129 #ifndef O_WRONLY | |
130 #define O_WRONLY 1 | |
131 #endif | |
132 | |
8597 | 133 #ifndef O_RDONLY |
134 #define O_RDONLY 0 | |
135 #endif | |
136 | |
230 | 137 #define min(a, b) ((a) < (b) ? (a) : (b)) |
138 #define max(a, b) ((a) > (b) ? (a) : (b)) | |
139 | |
140 /* Nonzero during writing of auto-save files */ | |
141 int auto_saving; | |
142 | |
143 /* Set by auto_save_1 to mode of original file so Fwrite_region will create | |
144 a new file with the same mode as the original */ | |
145 int auto_save_mode_bits; | |
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 | 170 /* Nonzero means, when reading a filename in the minibuffer, |
171 start out by inserting the default directory into the minibuffer. */ | |
172 int insert_default_directory; | |
173 | |
174 /* On VMS, nonzero means write new files with record format stmlf. | |
175 Zero means use var format. */ | |
176 int vms_stmlf_recfm; | |
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 | 192 Lisp_Object Qfile_error, Qfile_already_exists; |
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 | 198 report_file_error (string, data) |
199 char *string; | |
200 Lisp_Object data; | |
201 { | |
202 Lisp_Object errstring; | |
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 | 205 |
206 /* System error messages are capitalized. Downcase the initial | |
207 unless it is followed by a slash. */ | |
208 if (XSTRING (errstring)->data[1] != '/') | |
209 XSTRING (errstring)->data[0] = DOWNCASE (XSTRING (errstring)->data[0]); | |
210 | |
211 while (1) | |
212 Fsignal (Qfile_error, | |
213 Fcons (build_string (string), Fcons (errstring, data))); | |
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 | 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 | 308 DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory, |
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 | 312 Otherwise return a directory spec.\n\ |
313 Given a Unix syntax file name, returns a string ending in slash;\n\ | |
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 | 317 { |
318 register unsigned char *beg; | |
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 | 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 | 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 | 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 | 340 #ifdef VMS |
341 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>' | |
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 | 347 ) p--; |
348 | |
349 if (p == beg) | |
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 | 367 return make_string (beg, p - beg); |
368 } | |
369 | |
370 DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, Sfile_name_nondirectory, | |
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 | 373 For example, in a Unix-syntax file name,\n\ |
374 this is everything after the last slash,\n\ | |
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 | 378 { |
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 | 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 | 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 | 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 | 394 #ifdef VMS |
395 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>' | |
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 | 401 ) p--; |
402 | |
403 return make_string (p, end - p); | |
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 | 428 |
429 char * | |
430 file_name_as_directory (out, in) | |
431 char *out, *in; | |
432 { | |
433 int size = strlen (in) - 1; | |
434 | |
435 strcpy (out, in); | |
436 | |
437 #ifdef VMS | |
438 /* Is it already a directory string? */ | |
439 if (in[size] == ':' || in[size] == ']' || in[size] == '>') | |
440 return out; | |
441 /* Is it a VMS directory file name? If so, hack VMS syntax. */ | |
442 else if (! index (in, '/') | |
443 && ((size > 3 && ! strcmp (&in[size - 3], ".DIR")) | |
444 || (size > 3 && ! strcmp (&in[size - 3], ".dir")) | |
445 || (size > 5 && (! strncmp (&in[size - 5], ".DIR", 4) | |
446 || ! strncmp (&in[size - 5], ".dir", 4)) | |
447 && (in[size - 1] == '.' || in[size - 1] == ';') | |
448 && in[size] == '1'))) | |
449 { | |
450 register char *p, *dot; | |
451 char brack; | |
452 | |
453 /* x.dir -> [.x] | |
454 dir:x.dir --> dir:[x] | |
455 dir:[x]y.dir --> dir:[x.y] */ | |
456 p = in + size; | |
457 while (p != in && *p != ':' && *p != '>' && *p != ']') p--; | |
458 if (p != in) | |
459 { | |
460 strncpy (out, in, p - in); | |
461 out[p - in] = '\0'; | |
462 if (*p == ':') | |
463 { | |
464 brack = ']'; | |
465 strcat (out, ":["); | |
466 } | |
467 else | |
468 { | |
469 brack = *p; | |
470 strcat (out, "."); | |
471 } | |
472 p++; | |
473 } | |
474 else | |
475 { | |
476 brack = ']'; | |
477 strcpy (out, "[."); | |
478 } | |
372 | 479 dot = index (p, '.'); |
480 if (dot) | |
230 | 481 { |
482 /* blindly remove any extension */ | |
483 size = strlen (out) + (dot - p); | |
484 strncat (out, p, dot - p); | |
485 } | |
486 else | |
487 { | |
488 strcat (out, p); | |
489 size = strlen (out); | |
490 } | |
491 out[size++] = brack; | |
492 out[size] = '\0'; | |
493 } | |
494 #else /* not VMS */ | |
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 | 504 #endif /* not VMS */ |
505 return out; | |
506 } | |
507 | |
508 DEFUN ("file-name-as-directory", Ffile_name_as_directory, | |
509 Sfile_name_as_directory, 1, 1, 0, | |
510 "Return a string representing file FILENAME interpreted as a directory.\n\ | |
511 This operation exists because a directory is also a file, but its name as\n\ | |
512 a directory is different from its name as a file.\n\ | |
513 The result can be used as the value of `default-directory'\n\ | |
514 or passed as second argument to `expand-file-name'.\n\ | |
515 For a Unix-syntax file name, just appends a slash.\n\ | |
516 On VMS, converts \"[X]FOO.DIR\" to \"[X.FOO]\", etc.") | |
517 (file) | |
518 Lisp_Object file; | |
519 { | |
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 | 522 |
523 CHECK_STRING (file, 0); | |
485 | 524 if (NILP (file)) |
230 | 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 | 533 buf = (char *) alloca (XSTRING (file)->size + 10); |
534 return build_string (file_name_as_directory (buf, XSTRING (file)->data)); | |
535 } | |
536 | |
537 /* | |
538 * Convert from directory name to filename. | |
539 * On VMS: | |
540 * xyzzy:[mukesh.emacs] => xyzzy:[mukesh]emacs.dir.1 | |
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 | 543 |
544 * Value is nonzero if the string output is different from the input. | |
545 */ | |
546 | |
547 directory_file_name (src, dst) | |
548 char *src, *dst; | |
549 { | |
550 long slen; | |
551 #ifdef VMS | |
552 long rlen; | |
553 char * ptr, * rptr; | |
554 char bracket; | |
555 struct FAB fab = cc$rms_fab; | |
556 struct NAM nam = cc$rms_nam; | |
557 char esa[NAM$C_MAXRSS]; | |
558 #endif /* VMS */ | |
559 | |
560 slen = strlen (src); | |
561 #ifdef VMS | |
562 if (! index (src, '/') | |
563 && (src[slen - 1] == ']' | |
564 || src[slen - 1] == ':' | |
565 || src[slen - 1] == '>')) | |
566 { | |
567 /* VMS style - convert [x.y.z] to [x.y]z, [x] to [000000]x */ | |
568 fab.fab$l_fna = src; | |
569 fab.fab$b_fns = slen; | |
570 fab.fab$l_nam = &nam; | |
571 fab.fab$l_fop = FAB$M_NAM; | |
572 | |
573 nam.nam$l_esa = esa; | |
574 nam.nam$b_ess = sizeof esa; | |
575 nam.nam$b_nop |= NAM$M_SYNCHK; | |
576 | |
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 | 579 { |
580 slen = nam.nam$b_esl; | |
581 if (esa[slen - 1] == ';' && esa[slen - 2] == '.') | |
582 slen -= 2; | |
583 esa[slen] = '\0'; | |
584 src = esa; | |
585 } | |
586 if (src[slen - 1] != ']' && src[slen - 1] != '>') | |
587 { | |
588 /* what about when we have logical_name:???? */ | |
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 | 591 ptr = strcpy (dst, src); /* upper case for getenv */ |
592 while (*ptr) | |
593 { | |
594 if ('a' <= *ptr && *ptr <= 'z') | |
595 *ptr -= 040; | |
596 ptr++; | |
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 | 599 if (!(src = egetenv (dst))) |
600 return 0; | |
601 /* should we jump to the beginning of this procedure? | |
602 Good points: allows us to use logical names that xlate | |
603 to Unix names, | |
604 Bad points: can be a problem if we just translated to a device | |
605 name... | |
606 For now, I'll punt and always expect VMS names, and hope for | |
607 the best! */ | |
608 slen = strlen (src); | |
609 if (src[slen - 1] != ']' && src[slen - 1] != '>') | |
610 { /* no recursion here! */ | |
611 strcpy (dst, src); | |
612 return 0; | |
613 } | |
614 } | |
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 | 617 strcpy (dst, src); |
618 return 0; | |
619 } | |
620 } | |
621 bracket = src[slen - 1]; | |
622 | |
623 /* If bracket is ']' or '>', bracket - 2 is the corresponding | |
624 opening bracket. */ | |
372 | 625 ptr = index (src, bracket - 2); |
626 if (ptr == 0) | |
230 | 627 { /* no opening bracket */ |
628 strcpy (dst, src); | |
629 return 0; | |
630 } | |
631 if (!(rptr = rindex (src, '.'))) | |
632 rptr = ptr; | |
633 slen = rptr - src; | |
634 strncpy (dst, src, slen); | |
635 dst[slen] = '\0'; | |
636 if (*rptr == '.') | |
637 { | |
638 dst[slen++] = bracket; | |
639 dst[slen] = '\0'; | |
640 } | |
641 else | |
642 { | |
643 /* If we have the top-level of a rooted directory (i.e. xx:[000000]), | |
644 then translate the device and recurse. */ | |
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 | 648 { |
649 dst[slen - 1] = '\0'; | |
650 if ((ptr = egetenv (dst)) | |
651 && (rlen = strlen (ptr) - 1) > 0 | |
652 && (ptr[rlen] == ']' || ptr[rlen] == '>') | |
653 && ptr[rlen - 1] == '.') | |
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 | 660 } |
661 else | |
662 dst[slen - 1] = ':'; | |
663 } | |
664 strcat (dst, "[000000]"); | |
665 slen += 8; | |
666 } | |
667 rptr++; | |
668 rlen = strlen (rptr) - 1; | |
669 strncat (dst, rptr, rlen); | |
670 dst[slen + rlen] = '\0'; | |
671 strcat (dst, ".DIR.1"); | |
672 return 1; | |
673 } | |
674 #endif /* VMS */ | |
675 /* Process as Unix format: just remove any final slash. | |
676 But leave "/" unchanged; do not change it to "". */ | |
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 | 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 | 695 return 1; |
696 } | |
697 | |
698 DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name, | |
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 | 702 This operation exists because a directory is also a file, but its name as\n\ |
703 a directory is different from its name as a file.\n\ | |
704 In Unix-syntax, this function just removes the final slash.\n\ | |
705 On VMS, given a VMS-syntax directory name such as \"[X.Y]\",\n\ | |
706 it returns a file name such as \"[X]Y.DIR.1\".") | |
707 (directory) | |
708 Lisp_Object directory; | |
709 { | |
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 | 712 |
713 CHECK_STRING (directory, 0); | |
714 | |
485 | 715 if (NILP (directory)) |
230 | 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 | 724 #ifdef VMS |
725 /* 20 extra chars is insufficient for VMS, since we might perform a | |
726 logical name translation. an equivalence string can be up to 255 | |
727 chars long, so grab that much extra space... - sss */ | |
728 buf = (char *) alloca (XSTRING (directory)->size + 20 + 255); | |
729 #else | |
730 buf = (char *) alloca (XSTRING (directory)->size + 20); | |
731 #endif | |
732 directory_file_name (XSTRING (directory)->data, buf); | |
733 return build_string (buf); | |
734 } | |
735 | |
736 DEFUN ("make-temp-name", Fmake_temp_name, Smake_temp_name, 1, 1, 0, | |
737 "Generate temporary file name (string) starting with PREFIX (a string).\n\ | |
738 The Emacs process number forms part of the result,\n\ | |
739 so there is no danger of generating a name being used by another process.") | |
740 (prefix) | |
741 Lisp_Object prefix; | |
742 { | |
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 | 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 | 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 | 755 return val; |
756 } | |
757 | |
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 | 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 | 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 | 767 An initial `~/' expands to your home directory.\n\ |
768 An initial `~USER/' expands to USER's home directory.\n\ | |
230 | 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 | 772 { |
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 | 775 register unsigned char *newdir, *p, *o; |
776 int tlen; | |
777 unsigned char *target; | |
778 struct passwd *pw; | |
779 #ifdef VMS | |
780 unsigned char * colon = 0; | |
781 unsigned char * close = 0; | |
782 unsigned char * slash = 0; | |
783 unsigned char * brack = 0; | |
784 int lbrack = 0, rbrack = 0; | |
785 int dots = 0; | |
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 | 793 CHECK_STRING (name, 0); |
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 | 850 #ifdef VMS |
851 /* Filenames on VMS are always upper case. */ | |
852 name = Fupcase (name); | |
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 | 857 |
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 | 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 | 936 #ifdef VMS |
937 || index (nm, ':') | |
938 #endif /* VMS */ | |
939 ) | |
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 | 949 p = nm; |
950 while (*p) | |
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 | 962 lose = 1; |
963 #ifdef VMS | |
964 if (p[0] == '\\') | |
965 lose = 1; | |
966 if (p[0] == '/') { | |
967 /* if dev:[dir]/, move nm to / */ | |
968 if (!slash && p > nm && (brack || colon)) { | |
969 nm = (brack ? brack + 1 : colon + 1); | |
970 lbrack = rbrack = 0; | |
971 brack = 0; | |
972 colon = 0; | |
973 } | |
974 slash = p; | |
975 } | |
976 if (p[0] == '-') | |
977 #ifndef VMS4_4 | |
978 /* VMS pre V4.4,convert '-'s in filenames. */ | |
979 if (lbrack == rbrack) | |
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 | 982 p[0] = '_'; |
983 } | |
984 else | |
985 #endif /* VMS4_4 */ | |
986 if (lbrack > rbrack && | |
987 ((p[-1] == '.' || p[-1] == '[' || p[-1] == '<') && | |
988 (p[1] == '.' || p[1] == ']' || p[1] == '>'))) | |
989 lose = 1; | |
990 #ifndef VMS4_4 | |
991 else | |
992 p[0] = '_'; | |
993 #endif /* VMS4_4 */ | |
994 /* count open brackets, reset close bracket pointer */ | |
995 if (p[0] == '[' || p[0] == '<') | |
996 lbrack++, brack = 0; | |
997 /* count close brackets, set close bracket pointer */ | |
998 if (p[0] == ']' || p[0] == '>') | |
999 rbrack++, brack = p; | |
1000 /* detect ][ or >< */ | |
1001 if ((p[0] == ']' || p[0] == '>') && (p[1] == '[' || p[1] == '<')) | |
1002 lose = 1; | |
1003 if ((p[0] == ':' || p[0] == ']' || p[0] == '>') && p[1] == '~') | |
1004 nm = p + 1, lose = 1; | |
1005 if (p[0] == ':' && (colon || slash)) | |
1006 /* if dev1:[dir]dev2:, move nm to dev2: */ | |
1007 if (brack) | |
1008 { | |
1009 nm = brack + 1; | |
1010 brack = 0; | |
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 | 1013 else if (slash) |
1014 nm = slash + 1; | |
1015 /* if node::dev:, move colon following dev */ | |
1016 else if (colon && colon[-1] == ':') | |
1017 colon = p; | |
1018 /* if dev1:dev2:, move nm to dev2: */ | |
1019 else if (colon && colon[-1] != ':') | |
1020 { | |
1021 nm = colon + 1; | |
1022 colon = 0; | |
1023 } | |
1024 if (p[0] == ':' && !colon) | |
1025 { | |
1026 if (p[1] == ':') | |
1027 p++; | |
1028 colon = p; | |
1029 } | |
1030 if (lbrack == rbrack) | |
1031 if (p[0] == ';') | |
1032 dots = 2; | |
1033 else if (p[0] == '.') | |
1034 dots++; | |
1035 #endif /* VMS */ | |
1036 p++; | |
1037 } | |
1038 if (!lose) | |
1039 { | |
1040 #ifdef VMS | |
1041 if (index (nm, '/')) | |
1042 return build_string (sys_translate_unix (nm)); | |
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 | 1066 if (nm == XSTRING (name)->data) |
1067 return name; | |
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 | 1070 } |
1071 } | |
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 | 1088 |
1089 newdir = 0; | |
1090 | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 1178 #ifdef VMS |
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 | 1181 && !newdir) |
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 | 1184 } |
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 | 1257 { |
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 | 1261 { |
1262 unsigned char *temp = (unsigned char *) alloca (length); | |
1263 bcopy (newdir, temp, length - 1); | |
1264 temp[length - 1] = 0; | |
1265 newdir = temp; | |
1266 } | |
1267 tlen = length + 1; | |
1268 } | |
1269 else | |
1270 tlen = 0; | |
230 | 1271 |
372 | 1272 /* Now concatenate the directory and name to new space in the stack frame */ |
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 | 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 | 1282 *target = 0; |
1283 | |
1284 if (newdir) | |
1285 { | |
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 | 1288 strcpy (target, newdir); |
1289 else | |
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 | 1292 } |
1293 | |
1294 strcat (target, nm); | |
1295 #ifdef VMS | |
1296 if (index (target, '/')) | |
1297 strcpy (target, sys_translate_unix (target)); | |
1298 #endif /* VMS */ | |
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 | 1303 |
1304 p = target; | |
1305 o = target; | |
1306 | |
1307 while (*p) | |
1308 { | |
1309 #ifdef VMS | |
1310 if (*p != ']' && *p != '>' && *p != '-') | |
1311 { | |
1312 if (*p == '\\') | |
1313 p++; | |
1314 *o++ = *p++; | |
1315 } | |
1316 else if ((p[0] == ']' || p[0] == '>') && p[0] == p[1] + 2) | |
1317 /* brackets are offset from each other by 2 */ | |
1318 { | |
1319 p += 2; | |
1320 if (*p != '.' && *p != '-' && o[-1] != '.') | |
1321 /* convert [foo][bar] to [bar] */ | |
1322 while (o[-1] != '[' && o[-1] != '<') | |
1323 o--; | |
1324 else if (*p == '-' && *o != '.') | |
1325 *--p = '.'; | |
1326 } | |
1327 else if (p[0] == '-' && o[-1] == '.' && | |
1328 (p[1] == '.' || p[1] == ']' || p[1] == '>')) | |
1329 /* flush .foo.- ; leave - if stopped by '[' or '<' */ | |
1330 { | |
1331 do | |
1332 o--; | |
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 | 1335 p += 2; |
1336 else if (o[-1] == '.') /* '.foo.-]' ==> ']' */ | |
1337 p++, o--; | |
1338 /* else [foo.-] ==> [-] */ | |
1339 } | |
1340 else | |
1341 { | |
1342 #ifndef VMS4_4 | |
1343 if (*p == '-' && | |
1344 o[-1] != '[' && o[-1] != '<' && o[-1] != '.' && | |
1345 p[1] != ']' && p[1] != '>' && p[1] != '.') | |
1346 *p = '_'; | |
1347 #endif /* VMS4_4 */ | |
1348 *o++ = *p++; | |
1349 } | |
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 | 1353 *o++ = *p++; |
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 | 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 | 1361 ) |
1362 { | |
1363 o = target; | |
1364 p++; | |
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 | 1378 /* `/../' is the "superroot" on certain file systems. */ |
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 | 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 | 1383 ; |
1384 p += 3; | |
1385 } | |
1386 else | |
9789
a1e6724db219
Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1387 { |
230 | 1388 *o++ = *p++; |
1389 } | |
1390 #endif /* not VMS */ | |
1391 } | |
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 | 1408 return make_string (target, o - target); |
1409 } | |
9789
a1e6724db219
Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1410 |
230 | 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 | 1413 DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0, |
230 | 1414 "Convert FILENAME to absolute, and canonicalize it.\n\ |
1415 Second arg DEFAULT is directory to start with if FILENAME is relative\n\ | |
1416 (does not start with slash); if DEFAULT is nil or missing,\n\ | |
1417 the current buffer's value of default-directory is used.\n\ | |
1418 Filenames containing `.' or `..' as components are simplified;\n\ | |
1419 initial `~/' expands to your home directory.\n\ | |
1420 See also the function `substitute-in-file-name'.") | |
1421 (name, defalt) | |
1422 Lisp_Object name, defalt; | |
1423 { | |
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 | 1426 register unsigned char *newdir, *p, *o; |
1427 int tlen; | |
1428 unsigned char *target; | |
1429 struct passwd *pw; | |
1430 int lose; | |
1431 #ifdef VMS | |
1432 unsigned char * colon = 0; | |
1433 unsigned char * close = 0; | |
1434 unsigned char * slash = 0; | |
1435 unsigned char * brack = 0; | |
1436 int lbrack = 0, rbrack = 0; | |
1437 int dots = 0; | |
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 | 1440 CHECK_STRING (name, 0); |
1441 | |
1442 #ifdef VMS | |
1443 /* Filenames on VMS are always upper case. */ | |
1444 name = Fupcase (name); | |
1445 #endif | |
1446 | |
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 | 1449 /* If nm is absolute, flush ...// and detect /./ and /../. |
1450 If no /./ or /../ we can return right away. */ | |
1451 if ( | |
1452 nm[0] == '/' | |
1453 #ifdef VMS | |
1454 || index (nm, ':') | |
1455 #endif /* VMS */ | |
1456 ) | |
1457 { | |
1458 p = nm; | |
1459 lose = 0; | |
1460 while (*p) | |
1461 { | |
1462 if (p[0] == '/' && p[1] == '/' | |
1463 #ifdef APOLLO | |
1464 /* // at start of filename is meaningful on Apollo system */ | |
1465 && nm != p | |
1466 #endif /* APOLLO */ | |
1467 ) | |
1468 nm = p + 1; | |
1469 if (p[0] == '/' && p[1] == '~') | |
1470 nm = p + 1, lose = 1; | |
1471 if (p[0] == '/' && p[1] == '.' | |
1472 && (p[2] == '/' || p[2] == 0 | |
1473 || (p[2] == '.' && (p[3] == '/' || p[3] == 0)))) | |
1474 lose = 1; | |
1475 #ifdef VMS | |
1476 if (p[0] == '\\') | |
1477 lose = 1; | |
1478 if (p[0] == '/') { | |
1479 /* if dev:[dir]/, move nm to / */ | |
1480 if (!slash && p > nm && (brack || colon)) { | |
1481 nm = (brack ? brack + 1 : colon + 1); | |
1482 lbrack = rbrack = 0; | |
1483 brack = 0; | |
1484 colon = 0; | |
1485 } | |
1486 slash = p; | |
1487 } | |
1488 if (p[0] == '-') | |
1489 #ifndef VMS4_4 | |
1490 /* VMS pre V4.4,convert '-'s in filenames. */ | |
1491 if (lbrack == rbrack) | |
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 | 1494 p[0] = '_'; |
1495 } | |
1496 else | |
1497 #endif /* VMS4_4 */ | |
1498 if (lbrack > rbrack && | |
1499 ((p[-1] == '.' || p[-1] == '[' || p[-1] == '<') && | |
1500 (p[1] == '.' || p[1] == ']' || p[1] == '>'))) | |
1501 lose = 1; | |
1502 #ifndef VMS4_4 | |
1503 else | |
1504 p[0] = '_'; | |
1505 #endif /* VMS4_4 */ | |
1506 /* count open brackets, reset close bracket pointer */ | |
1507 if (p[0] == '[' || p[0] == '<') | |
1508 lbrack++, brack = 0; | |
1509 /* count close brackets, set close bracket pointer */ | |
1510 if (p[0] == ']' || p[0] == '>') | |
1511 rbrack++, brack = p; | |
1512 /* detect ][ or >< */ | |
1513 if ((p[0] == ']' || p[0] == '>') && (p[1] == '[' || p[1] == '<')) | |
1514 lose = 1; | |
1515 if ((p[0] == ':' || p[0] == ']' || p[0] == '>') && p[1] == '~') | |
1516 nm = p + 1, lose = 1; | |
1517 if (p[0] == ':' && (colon || slash)) | |
1518 /* if dev1:[dir]dev2:, move nm to dev2: */ | |
1519 if (brack) | |
1520 { | |
1521 nm = brack + 1; | |
1522 brack = 0; | |
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 | 1525 else if (slash) |
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 | 1528 else if (colon && colon[-1] == ':') |
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 | 1531 else if (colon && colon[-1] != ':') |
1532 { | |
1533 nm = colon + 1; | |
1534 colon = 0; | |
1535 } | |
1536 if (p[0] == ':' && !colon) | |
1537 { | |
1538 if (p[1] == ':') | |
1539 p++; | |
1540 colon = p; | |
1541 } | |
1542 if (lbrack == rbrack) | |
1543 if (p[0] == ';') | |
1544 dots = 2; | |
1545 else if (p[0] == '.') | |
1546 dots++; | |
1547 #endif /* VMS */ | |
1548 p++; | |
1549 } | |
1550 if (!lose) | |
1551 { | |
1552 #ifdef VMS | |
1553 if (index (nm, '/')) | |
1554 return build_string (sys_translate_unix (nm)); | |
1555 #endif /* VMS */ | |
1556 if (nm == XSTRING (name)->data) | |
1557 return name; | |
1558 return build_string (nm); | |
1559 } | |
1560 } | |
1561 | |
1562 /* Now determine directory to start with and put it in NEWDIR */ | |
1563 | |
1564 newdir = 0; | |
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 | 1567 if (nm[1] == '/' |
1568 #ifdef VMS | |
1569 || nm[1] == ':' | |
1570 #endif /* VMS */ | |
1571 || nm[1] == 0)/* ~/filename */ | |
1572 { | |
1573 if (!(newdir = (unsigned char *) egetenv ("HOME"))) | |
1574 newdir = (unsigned char *) ""; | |
1575 nm++; | |
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 | 1578 #endif /* VMS */ |
1579 } | |
1580 else /* ~user/filename */ | |
1581 { | |
1582 /* Get past ~ to user */ | |
1583 unsigned char *user = nm + 1; | |
1584 /* Find end of name. */ | |
1585 unsigned char *ptr = (unsigned char *) index (user, '/'); | |
1586 int len = ptr ? ptr - user : strlen (user); | |
1587 #ifdef VMS | |
1588 unsigned char *ptr1 = index (user, ':'); | |
1589 if (ptr1 != 0 && ptr1 - user < len) | |
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 | 1592 /* Copy the user name into temp storage. */ |
1593 o = (unsigned char *) alloca (len + 1); | |
1594 bcopy ((char *) user, o, len); | |
1595 o[len] = 0; | |
1596 | |
1597 /* Look up the user name. */ | |
1598 pw = (struct passwd *) getpwnam (o + 1); | |
1599 if (!pw) | |
1600 error ("\"%s\" isn't a registered user", o + 1); | |
1601 | |
1602 newdir = (unsigned char *) pw->pw_dir; | |
1603 | |
1604 /* Discard the user name from NM. */ | |
1605 nm += len; | |
1606 } | |
1607 | |
1608 if (nm[0] != '/' | |
1609 #ifdef VMS | |
1610 && !index (nm, ':') | |
1611 #endif /* not VMS */ | |
1612 && !newdir) | |
1613 { | |
485 | 1614 if (NILP (defalt)) |
230 | 1615 defalt = current_buffer->directory; |
1616 CHECK_STRING (defalt, 1); | |
1617 newdir = XSTRING (defalt)->data; | |
1618 } | |
1619 | |
1620 /* Now concatenate the directory and name to new space in the stack frame */ | |
1621 | |
1622 tlen = (newdir ? strlen (newdir) + 1 : 0) + strlen (nm) + 1; | |
1623 target = (unsigned char *) alloca (tlen); | |
1624 *target = 0; | |
1625 | |
1626 if (newdir) | |
1627 { | |
1628 #ifndef VMS | |
1629 if (nm[0] == 0 || nm[0] == '/') | |
1630 strcpy (target, newdir); | |
1631 else | |
1632 #endif | |
1633 file_name_as_directory (target, newdir); | |
1634 } | |
1635 | |
1636 strcat (target, nm); | |
1637 #ifdef VMS | |
1638 if (index (target, '/')) | |
1639 strcpy (target, sys_translate_unix (target)); | |
1640 #endif /* VMS */ | |
1641 | |
1642 /* Now canonicalize by removing /. and /foo/.. if they appear */ | |
1643 | |
1644 p = target; | |
1645 o = target; | |
1646 | |
1647 while (*p) | |
1648 { | |
1649 #ifdef VMS | |
1650 if (*p != ']' && *p != '>' && *p != '-') | |
1651 { | |
1652 if (*p == '\\') | |
1653 p++; | |
1654 *o++ = *p++; | |
1655 } | |
1656 else if ((p[0] == ']' || p[0] == '>') && p[0] == p[1] + 2) | |
1657 /* brackets are offset from each other by 2 */ | |
1658 { | |
1659 p += 2; | |
1660 if (*p != '.' && *p != '-' && o[-1] != '.') | |
1661 /* convert [foo][bar] to [bar] */ | |
1662 while (o[-1] != '[' && o[-1] != '<') | |
1663 o--; | |
1664 else if (*p == '-' && *o != '.') | |
1665 *--p = '.'; | |
1666 } | |
1667 else if (p[0] == '-' && o[-1] == '.' && | |
1668 (p[1] == '.' || p[1] == ']' || p[1] == '>')) | |
1669 /* flush .foo.- ; leave - if stopped by '[' or '<' */ | |
1670 { | |
1671 do | |
1672 o--; | |
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 | 1675 p += 2; |
1676 else if (o[-1] == '.') /* '.foo.-]' ==> ']' */ | |
1677 p++, o--; | |
1678 /* else [foo.-] ==> [-] */ | |
1679 } | |
1680 else | |
1681 { | |
1682 #ifndef VMS4_4 | |
1683 if (*p == '-' && | |
1684 o[-1] != '[' && o[-1] != '<' && o[-1] != '.' && | |
1685 p[1] != ']' && p[1] != '>' && p[1] != '.') | |
1686 *p = '_'; | |
1687 #endif /* VMS4_4 */ | |
1688 *o++ = *p++; | |
1689 } | |
1690 #else /* not VMS */ | |
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 | 1693 *o++ = *p++; |
1694 } | |
1695 else if (!strncmp (p, "//", 2) | |
1696 #ifdef APOLLO | |
1697 /* // at start of filename is meaningful in Apollo system */ | |
1698 && o != target | |
1699 #endif /* APOLLO */ | |
1700 ) | |
1701 { | |
1702 o = target; | |
1703 p++; | |
1704 } | |
1705 else if (p[0] == '/' && p[1] == '.' && | |
1706 (p[2] == '/' || p[2] == 0)) | |
1707 p += 2; | |
1708 else if (!strncmp (p, "/..", 3) | |
1709 /* `/../' is the "superroot" on certain file systems. */ | |
1710 && o != target | |
1711 && (p[3] == '/' || p[3] == 0)) | |
1712 { | |
1713 while (o != target && *--o != '/') | |
1714 ; | |
1715 #ifdef APOLLO | |
1716 if (o == target + 1 && o[-1] == '/' && o[0] == '/') | |
1717 ++o; | |
1718 else | |
1719 #endif /* APOLLO */ | |
1720 if (o == target && *o == '/') | |
1721 ++o; | |
1722 p += 3; | |
1723 } | |
1724 else | |
9789
a1e6724db219
Change explicit uses of the Unix directory separator
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1725 { |
230 | 1726 *o++ = *p++; |
1727 } | |
1728 #endif /* not VMS */ | |
1729 } | |
1730 | |
1731 return make_string (target, o - target); | |
1732 } | |
1733 #endif | |
1734 | |
1735 DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name, | |
1736 Ssubstitute_in_file_name, 1, 1, 0, | |
1737 "Substitute environment variables referred to in FILENAME.\n\ | |
1738 `$FOO' where FOO is an environment variable name means to substitute\n\ | |
1739 the value of that variable. The variable name should be terminated\n\ | |
1740 with a character not a letter, digit or underscore; otherwise, enclose\n\ | |
1741 the entire variable name in braces.\n\ | |
1742 If `/~' appears, all of FILENAME through that `/' is discarded.\n\n\ | |
1743 On VMS, `$' substitution is not done; this function does little and only\n\ | |
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 | 1747 { |
1748 unsigned char *nm; | |
1749 | |
1750 register unsigned char *s, *p, *o, *x, *endp; | |
1751 unsigned char *target; | |
1752 int total = 0; | |
1753 int substituted = 0; | |
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 | 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 | 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 | 1772 |
1773 /* If /~ or // appears, discard everything through first slash. */ | |
1774 | |
1775 for (p = nm; p != endp; p++) | |
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 | 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 | 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 | 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 | 1792 { |
1793 nm = p; | |
1794 substituted = 1; | |
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 | 1805 } |
1806 | |
1807 #ifdef VMS | |
1808 return build_string (nm); | |
1809 #else | |
1810 | |
1811 /* See if any variables are substituted into the string | |
1812 and find the total length of their values in `total' */ | |
1813 | |
1814 for (p = nm; p != endp;) | |
1815 if (*p != '$') | |
1816 p++; | |
1817 else | |
1818 { | |
1819 p++; | |
1820 if (p == endp) | |
1821 goto badsubst; | |
1822 else if (*p == '$') | |
1823 { | |
1824 /* "$$" means a single "$" */ | |
1825 p++; | |
1826 total -= 1; | |
1827 substituted = 1; | |
1828 continue; | |
1829 } | |
1830 else if (*p == '{') | |
1831 { | |
1832 o = ++p; | |
1833 while (p != endp && *p != '}') p++; | |
1834 if (*p != '}') goto missingclose; | |
1835 s = p; | |
1836 } | |
1837 else | |
1838 { | |
1839 o = p; | |
1840 while (p != endp && (isalnum (*p) || *p == '_')) p++; | |
1841 s = p; | |
1842 } | |
1843 | |
1844 /* Copy out the variable name */ | |
1845 target = (unsigned char *) alloca (s - o + 1); | |
1846 strncpy (target, o, s - o); | |
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 | 1851 |
1852 /* Get variable value */ | |
1853 o = (unsigned char *) egetenv (target); | |
1854 if (!o) goto badvar; | |
1855 total += strlen (o); | |
1856 substituted = 1; | |
1857 } | |
1858 | |
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 | 1861 |
1862 /* If substitution required, recopy the string and do it */ | |
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 | 1865 x = xnm; |
1866 | |
1867 /* Copy the rest of the name through, replacing $ constructs with values */ | |
1868 for (p = nm; *p;) | |
1869 if (*p != '$') | |
1870 *x++ = *p++; | |
1871 else | |
1872 { | |
1873 p++; | |
1874 if (p == endp) | |
1875 goto badsubst; | |
1876 else if (*p == '$') | |
1877 { | |
1878 *x++ = *p++; | |
1879 continue; | |
1880 } | |
1881 else if (*p == '{') | |
1882 { | |
1883 o = ++p; | |
1884 while (p != endp && *p != '}') p++; | |
1885 if (*p != '}') goto missingclose; | |
1886 s = p++; | |
1887 } | |
1888 else | |
1889 { | |
1890 o = p; | |
1891 while (p != endp && (isalnum (*p) || *p == '_')) p++; | |
1892 s = p; | |
1893 } | |
1894 | |
1895 /* Copy out the variable name */ | |
1896 target = (unsigned char *) alloca (s - o + 1); | |
1897 strncpy (target, o, s - o); | |
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 | 1902 |
1903 /* Get variable value */ | |
1904 o = (unsigned char *) egetenv (target); | |
1905 if (!o) | |
1906 goto badvar; | |
1907 | |
1908 strcpy (x, o); | |
1909 x += strlen (o); | |
1910 } | |
1911 | |
1912 *x = 0; | |
1913 | |
1914 /* If /~ or // appears, discard everything through first slash. */ | |
1915 | |
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 | 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 | 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 | 1931 |
1932 return make_string (xnm, x - xnm); | |
1933 | |
1934 badsubst: | |
1935 error ("Bad format environment-variable substitution"); | |
1936 missingclose: | |
1937 error ("Missing \"}\" in environment-variable substitution"); | |
1938 badvar: | |
1939 error ("Substituting nonexistent environment variable \"%s\"", target); | |
1940 | |
1941 /* NOTREACHED */ | |
1942 #endif /* not VMS */ | |
1943 } | |
1944 | |
853 | 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 | 1947 |
230 | 1948 Lisp_Object |
1949 expand_and_dir_to_file (filename, defdir) | |
1950 Lisp_Object filename, defdir; | |
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 | 1955 #ifdef VMS |
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 | 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 | 1960 } |
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 | 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 | 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 | 1971 } |
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 | 1983 Lisp_Object absname; |
1984 unsigned char *querystring; | |
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 | 1987 { |
1988 register Lisp_Object tem; | |
8597 | 1989 struct stat statbuf; |
230 | 1990 struct gcpro gcpro1; |
1991 | |
8597 | 1992 /* stat is a good way to tell whether the file exists, |
1993 regardless of what access permissions it has. */ | |
1994 if (stat (XSTRING (absname)->data, &statbuf) >= 0) | |
230 | 1995 { |
1996 if (! interactive) | |
1997 Fsignal (Qfile_already_exists, | |
1998 Fcons (build_string ("File already exists"), | |
1999 Fcons (absname, Qnil))); | |
2000 GCPRO1 (absname); | |
2001 tem = do_yes_or_no_p (format1 ("File %s already exists; %s anyway? ", | |
2002 XSTRING (absname)->data, querystring)); | |
2003 UNGCPRO; | |
485 | 2004 if (NILP (tem)) |
230 | 2005 Fsignal (Qfile_already_exists, |
2006 Fcons (build_string ("File already exists"), | |
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 | 2015 } |
2016 return; | |
2017 } | |
2018 | |
2019 DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 4, | |
410 | 2020 "fCopy file: \nFCopy %s to file: \np\nP", |
230 | 2021 "Copy FILE to NEWNAME. Both args must be strings.\n\ |
2022 Signals a `file-already-exists' error if file NEWNAME already exists,\n\ | |
2023 unless a third argument OK-IF-ALREADY-EXISTS is supplied and non-nil.\n\ | |
2024 A number as third arg means request confirmation if NEWNAME already exists.\n\ | |
2025 This is what happens in interactive use with M-x.\n\ | |
410 | 2026 Fourth arg KEEP-TIME non-nil means give the new file the same\n\ |
2027 last-modified time as the old one. (This works on only some systems.)\n\ | |
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 | 2031 { |
2032 int ifd, ofd, n; | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 2097 #ifdef VMS |
2098 /* Create the copy file with the same record format as the input file */ | |
2099 ofd = sys_creat (XSTRING (newname)->data, 0666, ifd); | |
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 | 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 | 2107 #endif /* VMS */ |
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 | 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 | 2115 while ((n = read (ifd, buf, sizeof buf)) > 0) |
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 | 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 | 2125 { |
485 | 2126 if (!NILP (keep_date)) |
230 | 2127 { |
564 | 2128 EMACS_TIME atime, mtime; |
2129 EMACS_SET_SECS_USECS (atime, st.st_atime, 0); | |
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 | 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 | 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 | 2146 } |
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 | 2153 UNGCPRO; |
2154 return Qnil; | |
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 | 2162 { |
2163 unsigned char *dir; | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2164 Lisp_Object handler; |
230 | 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 | 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 | 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 | 2181 |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2182 return Qnil; |
230 | 2183 } |
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 | 2189 { |
2190 unsigned char *dir; | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2191 Lisp_Object handler; |
230 | 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 | 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 | 2203 |
2204 return Qnil; | |
2205 } | |
2206 | |
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 | 2209 If file has multiple names, it continues to exist with the other names.") |
2210 (filename) | |
2211 Lisp_Object filename; | |
2212 { | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2213 Lisp_Object handler; |
230 | 2214 CHECK_STRING (filename, 0); |
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 | 2221 if (0 > unlink (XSTRING (filename)->data)) |
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 | 2224 } |
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 | 2243 DEFUN ("rename-file", Frename_file, Srename_file, 2, 3, |
2244 "fRename file: \nFRename %s to file: \np", | |
2245 "Rename FILE as NEWNAME. Both args strings.\n\ | |
2246 If file has names other than FILE, it continues to have those names.\n\ | |
2247 Signals a `file-already-exists' error if a file NEWNAME already exists\n\ | |
2248 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.\n\ | |
2249 A number as third arg means request confirmation if NEWNAME already exists.\n\ | |
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 | 2253 { |
2254 #ifdef NO_ARG_ARRAY | |
2255 Lisp_Object args[2]; | |
2256 #endif | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2257 Lisp_Object handler; |
230 | 2258 struct gcpro gcpro1, gcpro2; |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 2284 #endif |
2285 { | |
2286 if (errno == EXDEV) | |
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 | 2293 } |
2294 else | |
2295 #ifdef NO_ARG_ARRAY | |
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 | 2298 args[1] = newname; |
2299 report_file_error ("Renaming", Flist (2, args)); | |
2300 } | |
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 | 2303 #endif |
2304 } | |
2305 UNGCPRO; | |
2306 return Qnil; | |
2307 } | |
2308 | |
2309 DEFUN ("add-name-to-file", Fadd_name_to_file, Sadd_name_to_file, 2, 3, | |
2310 "fAdd name to file: \nFName to add to %s: \np", | |
2311 "Give FILE additional name NEWNAME. Both args strings.\n\ | |
2312 Signals a `file-already-exists' error if a file NEWNAME already exists\n\ | |
2313 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.\n\ | |
2314 A number as third arg means request confirmation if NEWNAME already exists.\n\ | |
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 | 2318 { |
2319 #ifdef NO_ARG_ARRAY | |
2320 Lisp_Object args[2]; | |
2321 #endif | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2322 Lisp_Object handler; |
230 | 2323 struct gcpro gcpro1, gcpro2; |
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 | 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 | 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 | 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 | 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 | 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 | 2356 { |
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 | 2359 args[1] = newname; |
2360 report_file_error ("Adding new name", Flist (2, args)); | |
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 | 2363 #endif |
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 | 2366 |
2367 UNGCPRO; | |
2368 return Qnil; | |
2369 } | |
2370 | |
2371 #ifdef S_IFLNK | |
2372 DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3, | |
2373 "FMake symbolic link to file: \nFMake symbolic link to file %s: \np", | |
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 | 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 | 2378 This happens for interactive use with M-x.") |
732 | 2379 (filename, linkname, ok_if_already_exists) |
2380 Lisp_Object filename, linkname, ok_if_already_exists; | |
230 | 2381 { |
2382 #ifdef NO_ARG_ARRAY | |
2383 Lisp_Object args[2]; | |
2384 #endif | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2385 Lisp_Object handler; |
230 | 2386 struct gcpro gcpro1, gcpro2; |
2387 | |
732 | 2388 GCPRO2 (filename, linkname); |
230 | 2389 CHECK_STRING (filename, 0); |
732 | 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 | 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 | 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 | 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 | 2416 if (0 > symlink (XSTRING (filename)->data, XSTRING (linkname)->data)) |
230 | 2417 { |
2418 /* If we didn't complain already, silently delete existing file. */ | |
2419 if (errno == EEXIST) | |
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 | 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 | 2427 } |
2428 | |
2429 #ifdef NO_ARG_ARRAY | |
2430 args[0] = filename; | |
732 | 2431 args[1] = linkname; |
230 | 2432 report_file_error ("Making symbolic link", Flist (2, args)); |
2433 #else | |
2434 report_file_error ("Making symbolic link", Flist (2, &filename)); | |
2435 #endif | |
2436 } | |
2437 UNGCPRO; | |
2438 return Qnil; | |
2439 } | |
2440 #endif /* S_IFLNK */ | |
2441 | |
2442 #ifdef VMS | |
2443 | |
2444 DEFUN ("define-logical-name", Fdefine_logical_name, Sdefine_logical_name, | |
2445 2, 2, "sDefine logical name: \nsDefine logical name %s as: ", | |
2446 "Define the job-wide logical name NAME to have the value STRING.\n\ | |
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 | 2450 Lisp_Object string; |
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 | 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 | 2455 else |
2456 { | |
2457 CHECK_STRING (string, 1); | |
2458 | |
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 | 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 | 2463 } |
2464 | |
2465 return string; | |
2466 } | |
2467 #endif /* VMS */ | |
2468 | |
2469 #ifdef HPUX_NET | |
2470 | |
2471 DEFUN ("sysnetunam", Fsysnetunam, Ssysnetunam, 2, 2, 0, | |
2472 "Open a network connection to PATH using LOGIN as the login string.") | |
2473 (path, login) | |
2474 Lisp_Object path, login; | |
2475 { | |
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 | 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 | 2481 netresult = netunam (XSTRING (path)->data, XSTRING (login)->data); |
2482 | |
2483 if (netresult == -1) | |
2484 return Qnil; | |
2485 else | |
2486 return Qt; | |
2487 } | |
2488 #endif /* HPUX_NET */ | |
2489 | |
2490 DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p, | |
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 | 2493 On Unix, this is a name starting with a `/' or a `~'.") |
2494 (filename) | |
2495 Lisp_Object filename; | |
2496 { | |
2497 unsigned char *ptr; | |
2498 | |
2499 CHECK_STRING (filename, 0); | |
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 | 2502 #ifdef VMS |
2503 /* ??? This criterion is probably wrong for '<'. */ | |
2504 || index (ptr, ':') || index (ptr, '<') | |
2505 || (*ptr == '[' && (ptr[1] != '-' || (ptr[2] != '.' && ptr[2] != ']')) | |
2506 && ptr[1] != '.') | |
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 | 2511 ) |
2512 return Qt; | |
2513 else | |
2514 return Qnil; | |
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 | 2575 |
2576 DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0, | |
2577 "Return t if file FILENAME exists. (This does not mean you can read it.)\n\ | |
2578 See also `file-readable-p' and `file-attributes'.") | |
2579 (filename) | |
2580 Lisp_Object filename; | |
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 | 2584 struct stat statbuf; |
230 | 2585 |
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 | 2596 } |
2597 | |
2598 DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0, | |
2599 "Return t if FILENAME can be executed by you.\n\ | |
2236 | 2600 For a directory, this means you can access files in that directory.") |
230 | 2601 (filename) |
2602 Lisp_Object filename; | |
2603 | |
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 | 2607 |
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 | 2618 } |
2619 | |
2620 DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0, | |
2621 "Return t if file FILENAME exists and you can read it.\n\ | |
2622 See also `file-exists-p' and `file-attributes'.") | |
2623 (filename) | |
2624 Lisp_Object filename; | |
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 | 2628 int desc; |
230 | 2629 |
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 | 2646 if (desc < 0) |
2647 return Qnil; | |
2648 close (desc); | |
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 | 2651 } |
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 | 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 | 2693 (filename) |
2694 Lisp_Object filename; | |
2695 { | |
2696 #ifdef S_IFLNK | |
2697 char *buf; | |
2698 int bufsize; | |
2699 int valsize; | |
2700 Lisp_Object val; | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2701 Lisp_Object handler; |
230 | 2702 |
2703 CHECK_STRING (filename, 0); | |
2704 filename = Fexpand_file_name (filename, Qnil); | |
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 | 2712 bufsize = 100; |
2713 while (1) | |
2714 { | |
2715 buf = (char *) xmalloc (bufsize); | |
2716 bzero (buf, bufsize); | |
2717 valsize = readlink (XSTRING (filename)->data, buf, bufsize); | |
2718 if (valsize < bufsize) break; | |
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 | 2721 bufsize *= 2; |
2722 } | |
2723 if (valsize == -1) | |
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 | 2726 return Qnil; |
2727 } | |
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 | 2730 return val; |
2731 #else /* not S_IFLNK */ | |
2732 return Qnil; | |
2733 #endif /* not S_IFLNK */ | |
2734 } | |
2735 | |
2736 DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0, | |
2737 "Return t if file FILENAME is the name of a directory as a file.\n\ | |
2738 A directory name spec may be given instead; then the value is t\n\ | |
2739 if the directory so specified exists and really is a directory.") | |
2740 (filename) | |
2741 Lisp_Object filename; | |
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 | 2744 struct stat st; |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2745 Lisp_Object handler; |
230 | 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 | 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 | 2756 return Qnil; |
2757 return (st.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil; | |
2758 } | |
2759 | |
536 | 2760 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p, Sfile_accessible_directory_p, 1, 1, 0, |
2761 "Return t if file FILENAME is the name of a directory as a file,\n\ | |
2762 and files in that directory can be opened by you. In order to use a\n\ | |
2763 directory as a buffer's current directory, this predicate must return true.\n\ | |
2764 A directory name spec may be given instead; then the value is t\n\ | |
2765 if the directory so specified exists and really is a readable and\n\ | |
2766 searchable directory.") | |
2767 (filename) | |
2768 Lisp_Object filename; | |
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 | 2791 } |
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 | 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 | 2818 (filename) |
2819 Lisp_Object filename; | |
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 | 2822 struct stat st; |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
2823 Lisp_Object handler; |
230 | 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 | 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 | 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 | 2840 return make_number (st.st_mode & 07777); |
2841 } | |
2842 | |
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 | 2845 Only the 12 low bits of MODE are used.") |
2846 (filename, mode) | |
2847 Lisp_Object filename, mode; | |
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 | 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 | 2853 CHECK_NUMBER (mode, 1); |
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 | 2863 |
2864 return Qnil; | |
2865 } | |
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 | 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 | 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 | 2877 |
2878 return Qnil; | |
2879 } | |
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 | 2884 () |
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 | 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 | 2908 DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0, |
2909 "Return t if file FILE1 is newer than file FILE2.\n\ | |
2910 If FILE1 does not exist, the answer is nil;\n\ | |
2911 otherwise, if FILE2 does not exist, the answer is t.") | |
2912 (file1, file2) | |
2913 Lisp_Object file1, file2; | |
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 | 2916 struct stat st; |
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 | 2920 |
2921 CHECK_STRING (file1, 0); | |
2922 CHECK_STRING (file2, 0); | |
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 | 2939 return Qnil; |
2940 | |
2941 mtime1 = st.st_mtime; | |
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 | 2944 return Qt; |
2945 | |
2946 return (mtime1 > st.st_mtime) ? Qt : Qnil; | |
2947 } | |
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 | 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 | 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 | 2957 If second argument VISIT is non-nil, the buffer's visited filename\n\ |
2958 and last save file modtime are set, and it is marked unmodified.\n\ | |
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 | 2971 { |
2972 struct stat st; | |
2973 register int fd; | |
2974 register int inserted = 0; | |
2975 register int how_much; | |
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 | 2993 |
2994 CHECK_STRING (filename, 0); | |
2995 filename = Fexpand_file_name (filename, Qnil); | |
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 | 3007 fd = -1; |
3008 | |
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 | 3011 #else |
8597 | 3012 if ((fd = open (XSTRING (filename)->data, O_RDONLY)) < 0 |
230 | 3013 || fstat (fd, &st) < 0) |
3014 #endif /* not APOLLO */ | |
3015 { | |
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 | 3018 if (NILP (visit)) |
230 | 3019 report_file_error ("Opening input file", Fcons (filename, Qnil)); |
3020 st.st_mtime = -1; | |
3021 how_much = 0; | |
3022 goto notfound; | |
3023 } | |
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 | 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 | 3049 record_unwind_protect (close_file_unwind, make_number (fd)); |
3050 | |
3051 /* Supposedly happens on VMS. */ | |
3052 if (st.st_size < 0) | |
3053 error ("File size is negative"); | |
752 | 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 | 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 | 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 | 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 | 3193 { |
3194 register Lisp_Object temp; | |
3195 | |
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 | 3199 error ("maximum buffer size exceeded"); |
3200 } | |
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 | 3203 prepare_to_modify_buffer (point, point); |
3204 | |
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 | 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 | 3227 |
3228 if (this <= 0) | |
3229 { | |
3230 how_much = this; | |
3231 break; | |
3232 } | |
3233 | |
3234 GPT += this; | |
3235 GAP_SIZE -= this; | |
3236 ZV += this; | |
3237 Z += this; | |
3238 inserted += this; | |
3239 } | |
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 | 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 | 3269 |
3270 close (fd); | |
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 | 3274 |
3275 if (how_much < 0) | |
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 | 3278 |
3279 notfound: | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
3280 handled: |
230 | 3281 |
485 | 3282 if (!NILP (visit)) |
230 | 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 | 3286 #ifdef APOLLO |
3287 stat (XSTRING (filename)->data, &st); | |
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 | 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 | 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 | 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 | 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 | 3314 report_file_error ("Opening input file", Fcons (filename, Qnil)); |
3315 } | |
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 | 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 | 3373 "r\nFWrite region to file: ", |
3374 "Write current region into specified file.\n\ | |
3375 When called from a program, takes three arguments:\n\ | |
3376 START, END and FILENAME. START and END are buffer positions.\n\ | |
3377 Optional fourth argument APPEND if non-nil means\n\ | |
3378 append to existing file contents (if any).\n\ | |
3379 Optional fifth argument VISIT if t means\n\ | |
3380 set the last-save-file-modtime of buffer to this file's modtime\n\ | |
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 | 3389 Kludgy feature: if START is a string, then that string is written\n\ |
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 | 3393 { |
3394 register int desc; | |
3395 int failure; | |
3396 int save_errno; | |
3397 unsigned char *fn; | |
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 | 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 | 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 | 3404 #endif /* VMS */ |
848 | 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 | 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 | 3420 validate_region (&start, &end); |
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 | 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 | 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 | 3481 #ifdef CLASH_DETECTION |
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 | 3484 #endif /* CLASH_DETECTION */ |
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 | 3487 desc = -1; |
485 | 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 | 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 | 3494 |
3495 if (desc < 0) | |
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 | 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 | 3500 desc = open (fn, O_RDWR); |
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 | 3503 ? XSTRING (current_buffer->filename)->data : 0, |
3504 fn); | |
230 | 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 | 3507 { |
3508 Lisp_Object temp_name; | |
3509 temp_name = Ffile_name_directory (filename); | |
3510 | |
485 | 3511 if (!NILP (temp_name)) |
230 | 3512 { |
3513 temp_name = Fmake_temp_name (concat2 (temp_name, | |
3514 build_string ("$$SAVE$$"))); | |
3515 fname = XSTRING (filename)->data; | |
3516 fn = XSTRING (temp_name)->data; | |
3517 desc = creat_copy_attrs (fname, fn); | |
3518 if (desc < 0) | |
3519 { | |
3520 /* If we can't open the temporary file, try creating a new | |
3521 version of the original file. VMS "creat" creates a | |
3522 new version rather than truncating an existing file. */ | |
3523 fn = fname; | |
3524 fname = 0; | |
3525 desc = creat (fn, 0666); | |
3526 #if 0 /* This can clobber an existing file and fail to replace it, | |
3527 if the user runs out of space. */ | |
3528 if (desc < 0) | |
3529 { | |
3530 /* We can't make a new version; | |
3531 try to truncate and rewrite existing version if any. */ | |
3532 vms_truncate (fn); | |
3533 desc = open (fn, O_RDWR); | |
3534 } | |
3535 #endif | |
3536 } | |
3537 } | |
3538 else | |
3539 desc = creat (fn, 0666); | |
3540 } | |
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 | 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 | 3549 #endif /* not VMS */ |
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 | 3553 if (desc < 0) |
3554 { | |
3555 #ifdef CLASH_DETECTION | |
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 | 3558 errno = save_errno; |
3559 #endif /* CLASH_DETECTION */ | |
3560 report_file_error ("Opening output file", Fcons (filename, Qnil)); | |
3561 } | |
3562 | |
3563 record_unwind_protect (close_file_unwind, make_number (desc)); | |
3564 | |
485 | 3565 if (!NILP (append)) |
230 | 3566 if (lseek (desc, 0, 2) < 0) |
3567 { | |
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 | 3570 #endif /* CLASH_DETECTION */ |
3571 report_file_error ("Lseek error", Fcons (filename, Qnil)); | |
3572 } | |
3573 | |
3574 #ifdef VMS | |
3575 /* | |
3576 * Kludge Warning: The VMS C RTL likes to insert carriage returns | |
3577 * if we do writes that don't end with a carriage return. Furthermore | |
3578 * it cannot handle writes of more then 16K. The modified | |
3579 * version of "sys_write" in SYSDEP.C (see comment there) copes with | |
3580 * this EXCEPT for the last record (iff it doesn't end with a carriage | |
3581 * return). This implies that if your buffer doesn't end with a carriage | |
3582 * return, you get one free... tough. However it also means that if | |
3583 * we make two calls to sys_write (a la the following code) you can | |
3584 * get one at the gap as well. The easiest way to fix this (honest) | |
3585 * is to move the gap to the next newline (or the end of the buffer). | |
3586 * Thus this change. | |
3587 * | |
3588 * Yech! | |
3589 */ | |
3590 if (GPT > BEG && GPT_ADDR[-1] != '\n') | |
3591 move_gap (find_next_newline (GPT, 1)); | |
3592 #endif | |
3593 | |
3594 failure = 0; | |
3595 immediate_quit = 1; | |
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 | 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 | 3601 save_errno = errno; |
3602 } | |
3603 else if (XINT (start) != XINT (end)) | |
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 | 3606 if (XINT (start) < GPT) |
3607 { | |
3608 register int end1 = XINT (end); | |
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 | 3613 save_errno = errno; |
3614 } | |
3615 | |
3616 if (XINT (end) > GPT && !failure) | |
3617 { | |
3618 tem = XINT (start); | |
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 | 3631 } |
3632 | |
3633 immediate_quit = 0; | |
3634 | |
2280
bd56d208ed22
* fileio.c (HAVE_FSYNC): Define, if appropriate.
Jim Blandy <jimb@redhat.com>
parents:
2257
diff
changeset
|
3635 #ifdef HAVE_FSYNC |
230 | 3636 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun). |
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 | 3646 #endif |
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 | 3649 observed on Suns as well. |
3650 It seems that `close' can change the modtime, under nfs. | |
3651 | |
3652 (This has supposedly been fixed in Sunos 4, | |
3653 but who knows about all the other machines with NFS?) */ | |
3654 #if 0 | |
3655 | |
3656 /* On VMS and APOLLO, must do the stat after the close | |
3657 since closing changes the modtime. */ | |
3658 #ifndef VMS | |
3659 #ifndef APOLLO | |
3660 /* Recall that #if defined does not work on VMS. */ | |
3661 #define FOO | |
3662 fstat (desc, &st); | |
3663 #endif | |
3664 #endif | |
3665 #endif | |
3666 | |
3667 /* NFS can report a write failure now. */ | |
3668 if (close (desc) < 0) | |
3669 failure = 1, save_errno = errno; | |
3670 | |
3671 #ifdef VMS | |
3672 /* If we wrote to a temporary name and had no errors, rename to real name. */ | |
3673 if (fname) | |
3674 { | |
3675 if (!failure) | |
3676 failure = (rename (fn, fname) != 0), save_errno = errno; | |
3677 fn = fname; | |
3678 } | |
3679 #endif /* VMS */ | |
3680 | |
3681 #ifndef FOO | |
3682 stat (fn, &st); | |
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 | 3688 |
3689 #ifdef CLASH_DETECTION | |
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 | 3692 #endif /* CLASH_DETECTION */ |
3693 | |
3694 /* Do this before reporting IO error | |
3695 to avoid a "file has changed on disk" warning on | |
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 | 3698 current_buffer->modtime = st.st_mtime; |
3699 | |
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 | 3702 |
4841
8800a7377ceb
(Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
3703 if (visiting) |
230 | 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 | 3709 } |
4841
8800a7377ceb
(Vafter_insert_file_functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
3710 else if (quietly) |
230 | 3711 return Qnil; |
3712 | |
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 | 3715 |
3716 return Qnil; | |
3717 } | |
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 | 3838 int |
3839 e_write (desc, addr, len) | |
3840 int desc; | |
3841 register char *addr; | |
3842 register int len; | |
3843 { | |
3844 char buf[16 * 1024]; | |
3845 register char *p, *end; | |
3846 | |
3847 if (!EQ (current_buffer->selective_display, Qt)) | |
3848 return write (desc, addr, len) - len; | |
3849 else | |
3850 { | |
3851 p = buf; | |
3852 end = p + sizeof buf; | |
3853 while (len--) | |
3854 { | |
3855 if (p == end) | |
3856 { | |
3857 if (write (desc, buf, sizeof buf) != sizeof buf) | |
3858 return -1; | |
3859 p = buf; | |
3860 } | |
3861 *p = *addr++; | |
3862 if (*p++ == '\015') | |
3863 p[-1] = '\n'; | |
3864 } | |
3865 if (p != buf) | |
3866 if (write (desc, buf, p - buf) != p - buf) | |
3867 return -1; | |
3868 } | |
3869 return 0; | |
3870 } | |
3871 | |
3872 DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime, | |
3873 Sverify_visited_file_modtime, 1, 1, 0, | |
3874 "Return t if last mod time of BUF's visited file matches what BUF records.\n\ | |
3875 This means that the file has not been changed since it was visited or saved.") | |
3876 (buf) | |
3877 Lisp_Object buf; | |
3878 { | |
3879 struct buffer *b; | |
3880 struct stat st; | |
843
8f6ea998ad0a
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
806
diff
changeset
|
3881 Lisp_Object handler; |
230 | 3882 |
3883 CHECK_BUFFER (buf, 0); | |
3884 b = XBUFFER (buf); | |
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 | 3887 if (b->modtime == 0) return Qt; |
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 | 3896 if (stat (XSTRING (b->filename)->data, &st) < 0) |
3897 { | |
3898 /* If the file doesn't exist now and didn't exist before, | |
3899 we say that it isn't modified, provided the error is a tame one. */ | |
3900 if (errno == ENOENT || errno == EACCES || errno == ENOTDIR) | |
3901 st.st_mtime = -1; | |
3902 else | |
3903 st.st_mtime = 0; | |
3904 } | |
3905 if (st.st_mtime == b->modtime | |
3906 /* If both are positive, accept them if they are off by one second. */ | |
3907 || (st.st_mtime > 0 && b->modtime > 0 | |
3908 && (st.st_mtime == b->modtime + 1 | |
3909 || st.st_mtime == b->modtime - 1))) | |
3910 return Qt; | |
3911 return Qnil; | |
3912 } | |
3913 | |
3914 DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime, | |
3915 Sclear_visited_file_modtime, 0, 0, 0, | |
3916 "Clear out records of last mod time of visited file.\n\ | |
3917 Next attempt to save will certainly not complain of a discrepancy.") | |
3918 () | |
3919 { | |
3920 current_buffer->modtime = 0; | |
3921 return Qnil; | |
3922 } | |
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 | 3929 () |
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 | 3964 |
3965 return Qnil; | |
3966 } | |
3967 | |
3968 Lisp_Object | |
3969 auto_save_error () | |
3970 { | |
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 | 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 | 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 | 3977 Fsleep_for (make_number (1), Qnil); |
230 | 3978 return Qnil; |
3979 } | |
3980 | |
3981 Lisp_Object | |
3982 auto_save_1 () | |
3983 { | |
3984 unsigned char *fn; | |
3985 struct stat st; | |
3986 | |
3987 /* Get visited file's mode to become the auto save file's mode. */ | |
3988 if (stat (XSTRING (current_buffer->filename)->data, &st) >= 0) | |
3989 /* But make sure we can overwrite it later! */ | |
3990 auto_save_mode_bits = st.st_mode | 0600; | |
3991 else | |
3992 auto_save_mode_bits = 0666; | |
3993 | |
3994 return | |
3995 Fwrite_region (Qnil, Qnil, | |
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 | 3998 } |
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 | 4010 DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "", |
4011 "Auto-save all buffers that need it.\n\ | |
4012 This is all buffers that have auto-saving enabled\n\ | |
4013 and are changed since last auto-saved.\n\ | |
4014 Auto-saving writes the buffer into a file\n\ | |
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 | 4022 { |
4023 struct buffer *old = current_buffer, *b; | |
4024 Lisp_Object tail, buf; | |
4025 int auto_saved = 0; | |
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 | 4039 |
4040 /* No GCPRO needed, because (when it matters) all Lisp_Object variables | |
4041 point to non-strings reached from Vbuffer_alist. */ | |
4042 | |
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 | 4045 |
485 | 4046 if (!NILP (Vrun_hooks)) |
230 | 4047 call1 (Vrun_hooks, intern ("auto-save-hook")); |
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 | 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 | 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 | 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 | 4181 return Qnil; |
4182 } | |
4183 | |
4184 DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved, | |
4185 Sset_buffer_auto_saved, 0, 0, 0, | |
4186 "Mark current buffer as auto-saved with its current text.\n\ | |
4187 No auto-save file will be written until the buffer changes again.") | |
4188 () | |
4189 { | |
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 | 4202 return Qnil; |
4203 } | |
4204 | |
4205 DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p, | |
4206 0, 0, 0, | |
4207 "Return t if buffer has been auto-saved since last read in or saved.") | |
4208 () | |
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 | 4211 } |
4212 | |
4213 /* Reading and completing file names */ | |
4214 extern Lisp_Object Ffile_name_completion (), Ffile_name_all_completions (); | |
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 | 4248 DEFUN ("read-file-name-internal", Fread_file_name_internal, Sread_file_name_internal, |
4249 3, 3, 0, | |
4250 "Internal subroutine for read-file-name. Do not call this.") | |
4251 (string, dir, action) | |
4252 Lisp_Object string, dir, action; | |
4253 /* action is nil for complete, t for return list of completions, | |
4254 lambda for verify final value */ | |
4255 { | |
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 | 4267 |
4268 if (XSTRING (string)->size == 0) | |
4269 { | |
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 | 4275 } |
4276 else | |
4277 { | |
4278 orig_string = string; | |
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 | 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 | 4285 } |
4286 | |
485 | 4287 if (NILP (action)) |
230 | 4288 { |
4289 specdir = Ffile_name_directory (string); | |
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 | 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 | 4297 } |
4298 | |
485 | 4299 if (!NILP (specdir)) |
230 | 4300 val = concat2 (specdir, val); |
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 | 4306 } |
1178
fb4ec23ef80f
Don't include sys/dir.h.
Richard M. Stallman <rms@gnu.org>
parents:
1105
diff
changeset
|
4307 UNGCPRO; |
230 | 4308 |
4309 if (EQ (action, Qt)) | |
4310 return Ffile_name_all_completions (name, realdir); | |
4311 /* Only other case actually used is ACTION = lambda */ | |
4312 #ifdef VMS | |
4313 /* Supposedly this helps commands such as `cd' that read directory names, | |
4314 but can someone explain how it helps them? -- RMS */ | |
4315 if (XSTRING (name)->size == 0) | |
4316 return Qt; | |
4317 #endif /* VMS */ | |
4318 return Ffile_exists_p (string); | |
4319 } | |
4320 | |
4321 DEFUN ("read-file-name", Fread_file_name, Sread_file_name, 1, 5, 0, | |
4322 "Read file name, prompting with PROMPT and completing in directory DIR.\n\ | |
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 | 4327 Fourth arg MUSTMATCH non-nil means require existing file's name.\n\ |
4328 Non-nil and non-t means also require confirmation after completion.\n\ | |
4329 Fifth arg INITIAL specifies text to start with.\n\ | |
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 | 4333 { |
866 | 4334 Lisp_Object val, insdef, insdef1, tem; |
230 | 4335 struct gcpro gcpro1, gcpro2; |
4336 register char *homedir; | |
4337 int count; | |
4338 | |
485 | 4339 if (NILP (dir)) |
230 | 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 | 4348 |
4349 /* If dir starts with user's homedir, change that to ~. */ | |
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 | 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 | 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 | 4359 { |
4360 dir = make_string (XSTRING (dir)->data + strlen (homedir) - 1, | |
4361 XSTRING (dir)->size - strlen (homedir) + 1); | |
4362 XSTRING (dir)->data[0] = '~'; | |
4363 } | |
4364 | |
4365 if (insert_default_directory) | |
4366 { | |
4367 insdef = dir; | |
485 | 4368 if (!NILP (initial)) |
230 | 4369 { |
863
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
4370 Lisp_Object args[2], pos; |
230 | 4371 |
4372 args[0] = insdef; | |
4373 args[1] = initial; | |
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 | 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 | 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 | 4386 else |
866 | 4387 insdef = Qnil, insdef1 = Qnil; |
230 | 4388 |
4389 #ifdef VMS | |
4390 count = specpdl_ptr - specpdl; | |
4391 specbind (intern ("completion-ignore-case"), Qt); | |
4392 #endif | |
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 | 4395 val = Fcompleting_read (prompt, intern ("read-file-name-internal"), |
866 | 4396 dir, mustmatch, insdef1, |
863
427299469901
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
853
diff
changeset
|
4397 Qfile_name_history); |
230 | 4398 |
4399 #ifdef VMS | |
4400 unbind_to (count, Qnil); | |
4401 #endif | |
4402 | |
4403 UNGCPRO; | |
485 | 4404 if (NILP (val)) |
230 | 4405 error ("No file name specified"); |
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 | 4416 return Fsubstitute_in_file_name (val); |
4417 } | |
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 | 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 | 4424 (prompt, dir, defalt, mustmatch, initial) |
4425 Lisp_Object prompt, dir, defalt, mustmatch, initial; | |
4426 { | |
4427 Lisp_Object val, insdef, tem; | |
4428 struct gcpro gcpro1, gcpro2; | |
4429 register char *homedir; | |
4430 int count; | |
4431 | |
485 | 4432 if (NILP (dir)) |
230 | 4433 dir = current_buffer->directory; |
485 | 4434 if (NILP (defalt)) |
230 | 4435 defalt = current_buffer->filename; |
4436 | |
4437 /* If dir starts with user's homedir, change that to ~. */ | |
4438 homedir = (char *) egetenv ("HOME"); | |
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 | 4441 && !strncmp (homedir, XSTRING (dir)->data, strlen (homedir)) |
4442 && XSTRING (dir)->data[strlen (homedir)] == '/') | |
4443 { | |
4444 dir = make_string (XSTRING (dir)->data + strlen (homedir) - 1, | |
4445 XSTRING (dir)->size - strlen (homedir) + 1); | |
4446 XSTRING (dir)->data[0] = '~'; | |
4447 } | |
4448 | |
485 | 4449 if (!NILP (initial)) |
230 | 4450 insdef = initial; |
4451 else if (insert_default_directory) | |
4452 insdef = dir; | |
4453 else | |
4454 insdef = build_string (""); | |
4455 | |
4456 #ifdef VMS | |
4457 count = specpdl_ptr - specpdl; | |
4458 specbind (intern ("completion-ignore-case"), Qt); | |
4459 #endif | |
4460 | |
4461 GCPRO2 (insdef, defalt); | |
4462 val = Fcompleting_read (prompt, intern ("read-file-name-internal"), | |
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 | 4466 |
4467 #ifdef VMS | |
4468 unbind_to (count, Qnil); | |
4469 #endif | |
4470 | |
4471 UNGCPRO; | |
485 | 4472 if (NILP (val)) |
230 | 4473 error ("No file name specified"); |
4474 tem = Fstring_equal (val, insdef); | |
485 | 4475 if (!NILP (tem) && !NILP (defalt)) |
230 | 4476 return defalt; |
4477 return Fsubstitute_in_file_name (val); | |
4478 } | |
4479 #endif /* Old version */ | |
4480 | |
4481 syms_of_fileio () | |
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 | 4546 Qfile_error = intern ("file-error"); |
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 | 4549 staticpro (&Qfile_already_exists); |
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 | 4571 Fput (Qfile_error, Qerror_conditions, |
4572 Fcons (Qfile_error, Fcons (Qerror, Qnil))); | |
4573 Fput (Qfile_error, Qerror_message, | |
4574 build_string ("File error")); | |
4575 | |
4576 Fput (Qfile_already_exists, Qerror_conditions, | |
4577 Fcons (Qfile_already_exists, | |
4578 Fcons (Qfile_error, Fcons (Qerror, Qnil)))); | |
4579 Fput (Qfile_already_exists, Qerror_message, | |
4580 build_string ("File already exists")); | |
4581 | |
4582 DEFVAR_BOOL ("insert-default-directory", &insert_default_directory, | |
4583 "*Non-nil means when reading a filename start with default dir in minibuffer."); | |
4584 insert_default_directory = 1; | |
4585 | |
4586 DEFVAR_BOOL ("vms-stmlf-recfm", &vms_stmlf_recfm, | |
4587 "*Non-nil means write new files with record format `stmlf'.\n\ | |
4588 nil means use format `var'. This variable is meaningful only on VMS."); | |
4589 vms_stmlf_recfm = 0; | |
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 | 4651 "File name in which we write a list of all auto save file names.\n\ |
4652 This variable is initialized automatically from `auto-save-list-file-prefix'\n\ | |
4653 shortly after Emacs reads your `.emacs' file, if you have not yet given it\n\ | |
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 | 4658 defsubr (&Sfile_name_directory); |
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 | 4661 defsubr (&Sfile_name_as_directory); |
4662 defsubr (&Sdirectory_file_name); | |
4663 defsubr (&Smake_temp_name); | |
4664 defsubr (&Sexpand_file_name); | |
4665 defsubr (&Ssubstitute_in_file_name); | |
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 | 4669 defsubr (&Sdelete_file); |
4670 defsubr (&Srename_file); | |
4671 defsubr (&Sadd_name_to_file); | |
4672 #ifdef S_IFLNK | |
4673 defsubr (&Smake_symbolic_link); | |
4674 #endif /* S_IFLNK */ | |
4675 #ifdef VMS | |
4676 defsubr (&Sdefine_logical_name); | |
4677 #endif /* VMS */ | |
4678 #ifdef HPUX_NET | |
4679 defsubr (&Ssysnetunam); | |
4680 #endif /* HPUX_NET */ | |
4681 defsubr (&Sfile_name_absolute_p); | |
4682 defsubr (&Sfile_exists_p); | |
4683 defsubr (&Sfile_executable_p); | |
4684 defsubr (&Sfile_readable_p); | |
4685 defsubr (&Sfile_writable_p); | |
4686 defsubr (&Sfile_symlink_p); | |
4687 defsubr (&Sfile_directory_p); | |
536 | 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 | 4690 defsubr (&Sfile_modes); |
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 | 4694 defsubr (&Sfile_newer_than_file_p); |
4695 defsubr (&Sinsert_file_contents); | |
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 | 4698 defsubr (&Sverify_visited_file_modtime); |
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 | 4701 defsubr (&Sset_visited_file_modtime); |
4702 defsubr (&Sdo_auto_save); | |
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 | 4705 defsubr (&Srecent_auto_save_p); |
4706 | |
4707 defsubr (&Sread_file_name_internal); | |
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 | 4713 } |