]> code.delx.au - gnu-emacs/blob - src/fileio.c
(Fcopy_file): Fix backward test of KEEP_TIME.
[gnu-emacs] / src / fileio.c
1 /* File IO for GNU Emacs.
2 Copyright (C) 1985,86,87,88,93,94,95,96,97,98,99,2000, 2001
3 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #define _GNU_SOURCE /* for euidaccess */
23
24 #include <config.h>
25
26 #if defined (USG5) || defined (BSD_SYSTEM) || defined (GNU_LINUX)
27 #include <fcntl.h>
28 #endif
29
30 #include <stdio.h>
31 #include <sys/types.h>
32 #include <sys/stat.h>
33
34 #ifdef HAVE_UNISTD_H
35 #include <unistd.h>
36 #endif
37
38 #if !defined (S_ISLNK) && defined (S_IFLNK)
39 # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
40 #endif
41
42 #if !defined (S_ISFIFO) && defined (S_IFIFO)
43 # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
44 #endif
45
46 #if !defined (S_ISREG) && defined (S_IFREG)
47 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
48 #endif
49
50 #ifdef VMS
51 #include "vms-pwd.h"
52 #else
53 #include <pwd.h>
54 #endif
55
56 #include <ctype.h>
57
58 #ifdef VMS
59 #include "vmsdir.h"
60 #include <perror.h>
61 #include <stddef.h>
62 #include <string.h>
63 #endif
64
65 #include <errno.h>
66
67 #ifndef vax11c
68 #ifndef USE_CRT_DLL
69 extern int errno;
70 #endif
71 #endif
72
73 #ifdef APOLLO
74 #include <sys/time.h>
75 #endif
76
77 #ifndef USG
78 #ifndef VMS
79 #ifndef BSD4_1
80 #ifndef WINDOWSNT
81 #define HAVE_FSYNC
82 #endif
83 #endif
84 #endif
85 #endif
86
87 #include "lisp.h"
88 #include "intervals.h"
89 #include "buffer.h"
90 #include "charset.h"
91 #include "coding.h"
92 #include "window.h"
93
94 #ifdef WINDOWSNT
95 #define NOMINMAX 1
96 #include <windows.h>
97 #include <stdlib.h>
98 #include <fcntl.h>
99 #endif /* not WINDOWSNT */
100
101 #ifdef MSDOS
102 #include "msdos.h"
103 #include <sys/param.h>
104 #if __DJGPP__ >= 2
105 #include <fcntl.h>
106 #include <string.h>
107 #endif
108 #endif
109
110 #ifdef DOS_NT
111 #define CORRECT_DIR_SEPS(s) \
112 do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
113 else unixtodos_filename (s); \
114 } while (0)
115 /* On Windows, drive letters must be alphabetic - on DOS, the Netware
116 redirector allows the six letters between 'Z' and 'a' as well. */
117 #ifdef MSDOS
118 #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
119 #endif
120 #ifdef WINDOWSNT
121 #define IS_DRIVE(x) isalpha (x)
122 #endif
123 /* Need to lower-case the drive letter, or else expanded
124 filenames will sometimes compare inequal, because
125 `expand-file-name' doesn't always down-case the drive letter. */
126 #define DRIVE_LETTER(x) (tolower (x))
127 #endif
128
129 #ifdef VMS
130 #include <file.h>
131 #include <rmsdef.h>
132 #include <fab.h>
133 #include <nam.h>
134 #endif
135
136 #include "systime.h"
137
138 #ifdef HPUX
139 #include <netio.h>
140 #ifndef HPUX8
141 #ifndef HPUX9
142 #include <errnet.h>
143 #endif
144 #endif
145 #endif
146
147 #include "commands.h"
148 extern int use_dialog_box;
149
150 #ifndef O_WRONLY
151 #define O_WRONLY 1
152 #endif
153
154 #ifndef O_RDONLY
155 #define O_RDONLY 0
156 #endif
157
158 #ifndef S_ISLNK
159 # define lstat stat
160 #endif
161
162 /* Nonzero during writing of auto-save files */
163 int auto_saving;
164
165 /* Set by auto_save_1 to mode of original file so Fwrite_region will create
166 a new file with the same mode as the original */
167 int auto_save_mode_bits;
168
169 /* Coding system for file names, or nil if none. */
170 Lisp_Object Vfile_name_coding_system;
171
172 /* Coding system for file names used only when
173 Vfile_name_coding_system is nil. */
174 Lisp_Object Vdefault_file_name_coding_system;
175
176 /* Alist of elements (REGEXP . HANDLER) for file names
177 whose I/O is done with a special handler. */
178 Lisp_Object Vfile_name_handler_alist;
179
180 /* Format for auto-save files */
181 Lisp_Object Vauto_save_file_format;
182
183 /* Lisp functions for translating file formats */
184 Lisp_Object Qformat_decode, Qformat_annotate_function;
185
186 /* Function to be called to decide a coding system of a reading file. */
187 Lisp_Object Vset_auto_coding_function;
188
189 /* Functions to be called to process text properties in inserted file. */
190 Lisp_Object Vafter_insert_file_functions;
191
192 /* Functions to be called to create text property annotations for file. */
193 Lisp_Object Vwrite_region_annotate_functions;
194
195 /* During build_annotations, each time an annotation function is called,
196 this holds the annotations made by the previous functions. */
197 Lisp_Object Vwrite_region_annotations_so_far;
198
199 /* File name in which we write a list of all our auto save files. */
200 Lisp_Object Vauto_save_list_file_name;
201
202 /* Function to call to read a file name. */
203 Lisp_Object Vread_file_name_function;
204
205 /* Current predicate used by read_file_name_internal. */
206 Lisp_Object Vread_file_name_predicate;
207
208 /* Nonzero means, when reading a filename in the minibuffer,
209 start out by inserting the default directory into the minibuffer. */
210 int insert_default_directory;
211
212 /* On VMS, nonzero means write new files with record format stmlf.
213 Zero means use var format. */
214 int vms_stmlf_recfm;
215
216 /* On NT, specifies the directory separator character, used (eg.) when
217 expanding file names. This can be bound to / or \. */
218 Lisp_Object Vdirectory_sep_char;
219
220 extern Lisp_Object Vuser_login_name;
221
222 #ifdef WINDOWSNT
223 extern Lisp_Object Vw32_get_true_file_attributes;
224 #endif
225
226 extern int minibuf_level;
227
228 extern int minibuffer_auto_raise;
229
230 /* These variables describe handlers that have "already" had a chance
231 to handle the current operation.
232
233 Vinhibit_file_name_handlers is a list of file name handlers.
234 Vinhibit_file_name_operation is the operation being handled.
235 If we try to handle that operation, we ignore those handlers. */
236
237 static Lisp_Object Vinhibit_file_name_handlers;
238 static Lisp_Object Vinhibit_file_name_operation;
239
240 Lisp_Object Qfile_error, Qfile_already_exists, Qfile_date_error;
241 Lisp_Object Qexcl;
242 Lisp_Object Qfile_name_history;
243
244 Lisp_Object Qcar_less_than_car;
245
246 static int a_write P_ ((int, Lisp_Object, int, int,
247 Lisp_Object *, struct coding_system *));
248 static int e_write P_ ((int, Lisp_Object, int, int, struct coding_system *));
249
250 \f
251 void
252 report_file_error (string, data)
253 const char *string;
254 Lisp_Object data;
255 {
256 Lisp_Object errstring;
257 int errorno = errno;
258
259 synchronize_system_messages_locale ();
260 errstring = code_convert_string_norecord (build_string (strerror (errorno)),
261 Vlocale_coding_system, 0);
262
263 while (1)
264 switch (errorno)
265 {
266 case EEXIST:
267 Fsignal (Qfile_already_exists, Fcons (errstring, data));
268 break;
269 default:
270 /* System error messages are capitalized. Downcase the initial
271 unless it is followed by a slash. */
272 if (SREF (errstring, 1) != '/')
273 SSET (errstring, 0, DOWNCASE (SREF (errstring, 0)));
274
275 Fsignal (Qfile_error,
276 Fcons (build_string (string), Fcons (errstring, data)));
277 }
278 }
279
280 Lisp_Object
281 close_file_unwind (fd)
282 Lisp_Object fd;
283 {
284 emacs_close (XFASTINT (fd));
285 return Qnil;
286 }
287
288 /* Restore point, having saved it as a marker. */
289
290 static Lisp_Object
291 restore_point_unwind (location)
292 Lisp_Object location;
293 {
294 Fgoto_char (location);
295 Fset_marker (location, Qnil, Qnil);
296 return Qnil;
297 }
298 \f
299 Lisp_Object Qexpand_file_name;
300 Lisp_Object Qsubstitute_in_file_name;
301 Lisp_Object Qdirectory_file_name;
302 Lisp_Object Qfile_name_directory;
303 Lisp_Object Qfile_name_nondirectory;
304 Lisp_Object Qunhandled_file_name_directory;
305 Lisp_Object Qfile_name_as_directory;
306 Lisp_Object Qcopy_file;
307 Lisp_Object Qmake_directory_internal;
308 Lisp_Object Qmake_directory;
309 Lisp_Object Qdelete_directory;
310 Lisp_Object Qdelete_file;
311 Lisp_Object Qrename_file;
312 Lisp_Object Qadd_name_to_file;
313 Lisp_Object Qmake_symbolic_link;
314 Lisp_Object Qfile_exists_p;
315 Lisp_Object Qfile_executable_p;
316 Lisp_Object Qfile_readable_p;
317 Lisp_Object Qfile_writable_p;
318 Lisp_Object Qfile_symlink_p;
319 Lisp_Object Qaccess_file;
320 Lisp_Object Qfile_directory_p;
321 Lisp_Object Qfile_regular_p;
322 Lisp_Object Qfile_accessible_directory_p;
323 Lisp_Object Qfile_modes;
324 Lisp_Object Qset_file_modes;
325 Lisp_Object Qfile_newer_than_file_p;
326 Lisp_Object Qinsert_file_contents;
327 Lisp_Object Qwrite_region;
328 Lisp_Object Qverify_visited_file_modtime;
329 Lisp_Object Qset_visited_file_modtime;
330
331 DEFUN ("find-file-name-handler", Ffind_file_name_handler, Sfind_file_name_handler, 2, 2, 0,
332 doc: /* Return FILENAME's handler function for OPERATION, if it has one.
333 Otherwise, return nil.
334 A file name is handled if one of the regular expressions in
335 `file-name-handler-alist' matches it.
336
337 If OPERATION equals `inhibit-file-name-operation', then we ignore
338 any handlers that are members of `inhibit-file-name-handlers',
339 but we still do run any other handlers. This lets handlers
340 use the standard functions without calling themselves recursively. */)
341 (filename, operation)
342 Lisp_Object filename, operation;
343 {
344 /* This function must not munge the match data. */
345 Lisp_Object chain, inhibited_handlers, result;
346 int pos = -1;
347
348 result = Qnil;
349 CHECK_STRING (filename);
350
351 if (EQ (operation, Vinhibit_file_name_operation))
352 inhibited_handlers = Vinhibit_file_name_handlers;
353 else
354 inhibited_handlers = Qnil;
355
356 for (chain = Vfile_name_handler_alist; CONSP (chain);
357 chain = XCDR (chain))
358 {
359 Lisp_Object elt;
360 elt = XCAR (chain);
361 if (CONSP (elt))
362 {
363 Lisp_Object string;
364 int match_pos;
365 string = XCAR (elt);
366 if (STRINGP (string)
367 && (match_pos = fast_string_match (string, filename)) > pos)
368 {
369 Lisp_Object handler, tem;
370
371 handler = XCDR (elt);
372 tem = Fmemq (handler, inhibited_handlers);
373 if (NILP (tem))
374 {
375 result = handler;
376 pos = match_pos;
377 }
378 }
379 }
380
381 QUIT;
382 }
383 return result;
384 }
385 \f
386 DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
387 1, 1, 0,
388 doc: /* Return the directory component in file name FILENAME.
389 Return nil if FILENAME does not include a directory.
390 Otherwise return a directory spec.
391 Given a Unix syntax file name, returns a string ending in slash;
392 on VMS, perhaps instead a string ending in `:', `]' or `>'. */)
393 (filename)
394 Lisp_Object filename;
395 {
396 #ifndef DOS_NT
397 register const unsigned char *beg;
398 #else
399 register unsigned char *beg;
400 #endif
401 register const unsigned char *p;
402 Lisp_Object handler;
403
404 CHECK_STRING (filename);
405
406 /* If the file name has special constructs in it,
407 call the corresponding file handler. */
408 handler = Ffind_file_name_handler (filename, Qfile_name_directory);
409 if (!NILP (handler))
410 return call2 (handler, Qfile_name_directory, filename);
411
412 #ifdef FILE_SYSTEM_CASE
413 filename = FILE_SYSTEM_CASE (filename);
414 #endif
415 beg = SDATA (filename);
416 #ifdef DOS_NT
417 beg = strcpy (alloca (strlen (beg) + 1), beg);
418 #endif
419 p = beg + SBYTES (filename);
420
421 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
422 #ifdef VMS
423 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
424 #endif /* VMS */
425 #ifdef DOS_NT
426 /* only recognise drive specifier at the beginning */
427 && !(p[-1] == ':'
428 /* handle the "/:d:foo" and "/:foo" cases correctly */
429 && ((p == beg + 2 && !IS_DIRECTORY_SEP (*beg))
430 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
431 #endif
432 ) p--;
433
434 if (p == beg)
435 return Qnil;
436 #ifdef DOS_NT
437 /* Expansion of "c:" to drive and default directory. */
438 if (p[-1] == ':')
439 {
440 /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir. */
441 unsigned char *res = alloca (MAXPATHLEN + 1);
442 unsigned char *r = res;
443
444 if (p == beg + 4 && IS_DIRECTORY_SEP (*beg) && beg[1] == ':')
445 {
446 strncpy (res, beg, 2);
447 beg += 2;
448 r += 2;
449 }
450
451 if (getdefdir (toupper (*beg) - 'A' + 1, r))
452 {
453 if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
454 strcat (res, "/");
455 beg = res;
456 p = beg + strlen (beg);
457 }
458 }
459 CORRECT_DIR_SEPS (beg);
460 #endif /* DOS_NT */
461
462 if (STRING_MULTIBYTE (filename))
463 return make_string (beg, p - beg);
464 return make_unibyte_string (beg, p - beg);
465 }
466
467 DEFUN ("file-name-nondirectory", Ffile_name_nondirectory,
468 Sfile_name_nondirectory, 1, 1, 0,
469 doc: /* Return file name FILENAME sans its directory.
470 For example, in a Unix-syntax file name,
471 this is everything after the last slash,
472 or the entire name if it contains no slash. */)
473 (filename)
474 Lisp_Object filename;
475 {
476 register const unsigned char *beg, *p, *end;
477 Lisp_Object handler;
478
479 CHECK_STRING (filename);
480
481 /* If the file name has special constructs in it,
482 call the corresponding file handler. */
483 handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory);
484 if (!NILP (handler))
485 return call2 (handler, Qfile_name_nondirectory, filename);
486
487 beg = SDATA (filename);
488 end = p = beg + SBYTES (filename);
489
490 while (p != beg && !IS_DIRECTORY_SEP (p[-1])
491 #ifdef VMS
492 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
493 #endif /* VMS */
494 #ifdef DOS_NT
495 /* only recognise drive specifier at beginning */
496 && !(p[-1] == ':'
497 /* handle the "/:d:foo" case correctly */
498 && (p == beg + 2 || (p == beg + 4 && IS_DIRECTORY_SEP (*beg))))
499 #endif
500 )
501 p--;
502
503 if (STRING_MULTIBYTE (filename))
504 return make_string (p, end - p);
505 return make_unibyte_string (p, end - p);
506 }
507
508 DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory,
509 Sunhandled_file_name_directory, 1, 1, 0,
510 doc: /* Return a directly usable directory name somehow associated with FILENAME.
511 A `directly usable' directory name is one that may be used without the
512 intervention of any file handler.
513 If FILENAME is a directly usable file itself, return
514 \(file-name-directory FILENAME).
515 The `call-process' and `start-process' functions use this function to
516 get a current directory to run processes in. */)
517 (filename)
518 Lisp_Object filename;
519 {
520 Lisp_Object handler;
521
522 /* If the file name has special constructs in it,
523 call the corresponding file handler. */
524 handler = Ffind_file_name_handler (filename, Qunhandled_file_name_directory);
525 if (!NILP (handler))
526 return call2 (handler, Qunhandled_file_name_directory, filename);
527
528 return Ffile_name_directory (filename);
529 }
530
531 \f
532 char *
533 file_name_as_directory (out, in)
534 char *out, *in;
535 {
536 int size = strlen (in) - 1;
537
538 strcpy (out, in);
539
540 if (size < 0)
541 {
542 out[0] = '.';
543 out[1] = '/';
544 out[2] = 0;
545 return out;
546 }
547
548 #ifdef VMS
549 /* Is it already a directory string? */
550 if (in[size] == ':' || in[size] == ']' || in[size] == '>')
551 return out;
552 /* Is it a VMS directory file name? If so, hack VMS syntax. */
553 else if (! index (in, '/')
554 && ((size > 3 && ! strcmp (&in[size - 3], ".DIR"))
555 || (size > 3 && ! strcmp (&in[size - 3], ".dir"))
556 || (size > 5 && (! strncmp (&in[size - 5], ".DIR", 4)
557 || ! strncmp (&in[size - 5], ".dir", 4))
558 && (in[size - 1] == '.' || in[size - 1] == ';')
559 && in[size] == '1')))
560 {
561 register char *p, *dot;
562 char brack;
563
564 /* x.dir -> [.x]
565 dir:x.dir --> dir:[x]
566 dir:[x]y.dir --> dir:[x.y] */
567 p = in + size;
568 while (p != in && *p != ':' && *p != '>' && *p != ']') p--;
569 if (p != in)
570 {
571 strncpy (out, in, p - in);
572 out[p - in] = '\0';
573 if (*p == ':')
574 {
575 brack = ']';
576 strcat (out, ":[");
577 }
578 else
579 {
580 brack = *p;
581 strcat (out, ".");
582 }
583 p++;
584 }
585 else
586 {
587 brack = ']';
588 strcpy (out, "[.");
589 }
590 dot = index (p, '.');
591 if (dot)
592 {
593 /* blindly remove any extension */
594 size = strlen (out) + (dot - p);
595 strncat (out, p, dot - p);
596 }
597 else
598 {
599 strcat (out, p);
600 size = strlen (out);
601 }
602 out[size++] = brack;
603 out[size] = '\0';
604 }
605 #else /* not VMS */
606 /* For Unix syntax, Append a slash if necessary */
607 if (!IS_DIRECTORY_SEP (out[size]))
608 {
609 /* Cannot use DIRECTORY_SEP, which could have any value */
610 out[size + 1] = '/';
611 out[size + 2] = '\0';
612 }
613 #ifdef DOS_NT
614 CORRECT_DIR_SEPS (out);
615 #endif
616 #endif /* not VMS */
617 return out;
618 }
619
620 DEFUN ("file-name-as-directory", Ffile_name_as_directory,
621 Sfile_name_as_directory, 1, 1, 0,
622 doc: /* Return a string representing the file name FILE interpreted as a directory.
623 This operation exists because a directory is also a file, but its name as
624 a directory is different from its name as a file.
625 The result can be used as the value of `default-directory'
626 or passed as second argument to `expand-file-name'.
627 For a Unix-syntax file name, just appends a slash.
628 On VMS, converts \"[X]FOO.DIR\" to \"[X.FOO]\", etc. */)
629 (file)
630 Lisp_Object file;
631 {
632 char *buf;
633 Lisp_Object handler;
634
635 CHECK_STRING (file);
636 if (NILP (file))
637 return Qnil;
638
639 /* If the file name has special constructs in it,
640 call the corresponding file handler. */
641 handler = Ffind_file_name_handler (file, Qfile_name_as_directory);
642 if (!NILP (handler))
643 return call2 (handler, Qfile_name_as_directory, file);
644
645 buf = (char *) alloca (SBYTES (file) + 10);
646 return build_string (file_name_as_directory (buf, SDATA (file)));
647 }
648 \f
649 /*
650 * Convert from directory name to filename.
651 * On VMS:
652 * xyzzy:[mukesh.emacs] => xyzzy:[mukesh]emacs.dir.1
653 * xyzzy:[mukesh] => xyzzy:[000000]mukesh.dir.1
654 * On UNIX, it's simple: just make sure there isn't a terminating /
655
656 * Value is nonzero if the string output is different from the input.
657 */
658
659 int
660 directory_file_name (src, dst)
661 char *src, *dst;
662 {
663 long slen;
664 #ifdef VMS
665 long rlen;
666 char * ptr, * rptr;
667 char bracket;
668 struct FAB fab = cc$rms_fab;
669 struct NAM nam = cc$rms_nam;
670 char esa[NAM$C_MAXRSS];
671 #endif /* VMS */
672
673 slen = strlen (src);
674 #ifdef VMS
675 if (! index (src, '/')
676 && (src[slen - 1] == ']'
677 || src[slen - 1] == ':'
678 || src[slen - 1] == '>'))
679 {
680 /* VMS style - convert [x.y.z] to [x.y]z, [x] to [000000]x */
681 fab.fab$l_fna = src;
682 fab.fab$b_fns = slen;
683 fab.fab$l_nam = &nam;
684 fab.fab$l_fop = FAB$M_NAM;
685
686 nam.nam$l_esa = esa;
687 nam.nam$b_ess = sizeof esa;
688 nam.nam$b_nop |= NAM$M_SYNCHK;
689
690 /* We call SYS$PARSE to handle such things as [--] for us. */
691 if (SYS$PARSE (&fab, 0, 0) == RMS$_NORMAL)
692 {
693 slen = nam.nam$b_esl;
694 if (esa[slen - 1] == ';' && esa[slen - 2] == '.')
695 slen -= 2;
696 esa[slen] = '\0';
697 src = esa;
698 }
699 if (src[slen - 1] != ']' && src[slen - 1] != '>')
700 {
701 /* what about when we have logical_name:???? */
702 if (src[slen - 1] == ':')
703 { /* Xlate logical name and see what we get */
704 ptr = strcpy (dst, src); /* upper case for getenv */
705 while (*ptr)
706 {
707 if ('a' <= *ptr && *ptr <= 'z')
708 *ptr -= 040;
709 ptr++;
710 }
711 dst[slen - 1] = 0; /* remove colon */
712 if (!(src = egetenv (dst)))
713 return 0;
714 /* should we jump to the beginning of this procedure?
715 Good points: allows us to use logical names that xlate
716 to Unix names,
717 Bad points: can be a problem if we just translated to a device
718 name...
719 For now, I'll punt and always expect VMS names, and hope for
720 the best! */
721 slen = strlen (src);
722 if (src[slen - 1] != ']' && src[slen - 1] != '>')
723 { /* no recursion here! */
724 strcpy (dst, src);
725 return 0;
726 }
727 }
728 else
729 { /* not a directory spec */
730 strcpy (dst, src);
731 return 0;
732 }
733 }
734 bracket = src[slen - 1];
735
736 /* If bracket is ']' or '>', bracket - 2 is the corresponding
737 opening bracket. */
738 ptr = index (src, bracket - 2);
739 if (ptr == 0)
740 { /* no opening bracket */
741 strcpy (dst, src);
742 return 0;
743 }
744 if (!(rptr = rindex (src, '.')))
745 rptr = ptr;
746 slen = rptr - src;
747 strncpy (dst, src, slen);
748 dst[slen] = '\0';
749 if (*rptr == '.')
750 {
751 dst[slen++] = bracket;
752 dst[slen] = '\0';
753 }
754 else
755 {
756 /* If we have the top-level of a rooted directory (i.e. xx:[000000]),
757 then translate the device and recurse. */
758 if (dst[slen - 1] == ':'
759 && dst[slen - 2] != ':' /* skip decnet nodes */
760 && strcmp (src + slen, "[000000]") == 0)
761 {
762 dst[slen - 1] = '\0';
763 if ((ptr = egetenv (dst))
764 && (rlen = strlen (ptr) - 1) > 0
765 && (ptr[rlen] == ']' || ptr[rlen] == '>')
766 && ptr[rlen - 1] == '.')
767 {
768 char * buf = (char *) alloca (strlen (ptr) + 1);
769 strcpy (buf, ptr);
770 buf[rlen - 1] = ']';
771 buf[rlen] = '\0';
772 return directory_file_name (buf, dst);
773 }
774 else
775 dst[slen - 1] = ':';
776 }
777 strcat (dst, "[000000]");
778 slen += 8;
779 }
780 rptr++;
781 rlen = strlen (rptr) - 1;
782 strncat (dst, rptr, rlen);
783 dst[slen + rlen] = '\0';
784 strcat (dst, ".DIR.1");
785 return 1;
786 }
787 #endif /* VMS */
788 /* Process as Unix format: just remove any final slash.
789 But leave "/" unchanged; do not change it to "". */
790 strcpy (dst, src);
791 #ifdef APOLLO
792 /* Handle // as root for apollo's. */
793 if ((slen > 2 && dst[slen - 1] == '/')
794 || (slen > 1 && dst[0] != '/' && dst[slen - 1] == '/'))
795 dst[slen - 1] = 0;
796 #else
797 if (slen > 1
798 && IS_DIRECTORY_SEP (dst[slen - 1])
799 #ifdef DOS_NT
800 && !IS_ANY_SEP (dst[slen - 2])
801 #endif
802 )
803 dst[slen - 1] = 0;
804 #endif
805 #ifdef DOS_NT
806 CORRECT_DIR_SEPS (dst);
807 #endif
808 return 1;
809 }
810
811 DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
812 1, 1, 0,
813 doc: /* Returns the file name of the directory named DIRECTORY.
814 This is the name of the file that holds the data for the directory DIRECTORY.
815 This operation exists because a directory is also a file, but its name as
816 a directory is different from its name as a file.
817 In Unix-syntax, this function just removes the final slash.
818 On VMS, given a VMS-syntax directory name such as \"[X.Y]\",
819 it returns a file name such as \"[X]Y.DIR.1\". */)
820 (directory)
821 Lisp_Object directory;
822 {
823 char *buf;
824 Lisp_Object handler;
825
826 CHECK_STRING (directory);
827
828 if (NILP (directory))
829 return Qnil;
830
831 /* If the file name has special constructs in it,
832 call the corresponding file handler. */
833 handler = Ffind_file_name_handler (directory, Qdirectory_file_name);
834 if (!NILP (handler))
835 return call2 (handler, Qdirectory_file_name, directory);
836
837 #ifdef VMS
838 /* 20 extra chars is insufficient for VMS, since we might perform a
839 logical name translation. an equivalence string can be up to 255
840 chars long, so grab that much extra space... - sss */
841 buf = (char *) alloca (SBYTES (directory) + 20 + 255);
842 #else
843 buf = (char *) alloca (SBYTES (directory) + 20);
844 #endif
845 directory_file_name (SDATA (directory), buf);
846 return build_string (buf);
847 }
848
849 static char make_temp_name_tbl[64] =
850 {
851 'A','B','C','D','E','F','G','H',
852 'I','J','K','L','M','N','O','P',
853 'Q','R','S','T','U','V','W','X',
854 'Y','Z','a','b','c','d','e','f',
855 'g','h','i','j','k','l','m','n',
856 'o','p','q','r','s','t','u','v',
857 'w','x','y','z','0','1','2','3',
858 '4','5','6','7','8','9','-','_'
859 };
860
861 static unsigned make_temp_name_count, make_temp_name_count_initialized_p;
862
863 /* Value is a temporary file name starting with PREFIX, a string.
864
865 The Emacs process number forms part of the result, so there is
866 no danger of generating a name being used by another process.
867 In addition, this function makes an attempt to choose a name
868 which has no existing file. To make this work, PREFIX should be
869 an absolute file name.
870
871 BASE64_P non-zero means add the pid as 3 characters in base64
872 encoding. In this case, 6 characters will be added to PREFIX to
873 form the file name. Otherwise, if Emacs is running on a system
874 with long file names, add the pid as a decimal number.
875
876 This function signals an error if no unique file name could be
877 generated. */
878
879 Lisp_Object
880 make_temp_name (prefix, base64_p)
881 Lisp_Object prefix;
882 int base64_p;
883 {
884 Lisp_Object val;
885 int len;
886 int pid;
887 unsigned char *p, *data;
888 char pidbuf[20];
889 int pidlen;
890
891 CHECK_STRING (prefix);
892
893 /* VAL is created by adding 6 characters to PREFIX. The first
894 three are the PID of this process, in base 64, and the second
895 three are incremented if the file already exists. This ensures
896 262144 unique file names per PID per PREFIX. */
897
898 pid = (int) getpid ();
899
900 if (base64_p)
901 {
902 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
903 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
904 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
905 pidlen = 3;
906 }
907 else
908 {
909 #ifdef HAVE_LONG_FILE_NAMES
910 sprintf (pidbuf, "%d", pid);
911 pidlen = strlen (pidbuf);
912 #else
913 pidbuf[0] = make_temp_name_tbl[pid & 63], pid >>= 6;
914 pidbuf[1] = make_temp_name_tbl[pid & 63], pid >>= 6;
915 pidbuf[2] = make_temp_name_tbl[pid & 63], pid >>= 6;
916 pidlen = 3;
917 #endif
918 }
919
920 len = SCHARS (prefix);
921 val = make_uninit_string (len + 3 + pidlen);
922 data = SDATA (val);
923 bcopy(SDATA (prefix), data, len);
924 p = data + len;
925
926 bcopy (pidbuf, p, pidlen);
927 p += pidlen;
928
929 /* Here we try to minimize useless stat'ing when this function is
930 invoked many times successively with the same PREFIX. We achieve
931 this by initializing count to a random value, and incrementing it
932 afterwards.
933
934 We don't want make-temp-name to be called while dumping,
935 because then make_temp_name_count_initialized_p would get set
936 and then make_temp_name_count would not be set when Emacs starts. */
937
938 if (!make_temp_name_count_initialized_p)
939 {
940 make_temp_name_count = (unsigned) time (NULL);
941 make_temp_name_count_initialized_p = 1;
942 }
943
944 while (1)
945 {
946 struct stat ignored;
947 unsigned num = make_temp_name_count;
948
949 p[0] = make_temp_name_tbl[num & 63], num >>= 6;
950 p[1] = make_temp_name_tbl[num & 63], num >>= 6;
951 p[2] = make_temp_name_tbl[num & 63], num >>= 6;
952
953 /* Poor man's congruential RN generator. Replace with
954 ++make_temp_name_count for debugging. */
955 make_temp_name_count += 25229;
956 make_temp_name_count %= 225307;
957
958 if (stat (data, &ignored) < 0)
959 {
960 /* We want to return only if errno is ENOENT. */
961 if (errno == ENOENT)
962 return val;
963 else
964 /* The error here is dubious, but there is little else we
965 can do. The alternatives are to return nil, which is
966 as bad as (and in many cases worse than) throwing the
967 error, or to ignore the error, which will likely result
968 in looping through 225307 stat's, which is not only
969 dog-slow, but also useless since it will fallback to
970 the errow below, anyway. */
971 report_file_error ("Cannot create temporary name for prefix",
972 Fcons (prefix, Qnil));
973 /* not reached */
974 }
975 }
976
977 error ("Cannot create temporary name for prefix `%s'",
978 SDATA (prefix));
979 return Qnil;
980 }
981
982
983 DEFUN ("make-temp-name", Fmake_temp_name, Smake_temp_name, 1, 1, 0,
984 doc: /* Generate temporary file name (string) starting with PREFIX (a string).
985 The Emacs process number forms part of the result,
986 so there is no danger of generating a name being used by another process.
987
988 In addition, this function makes an attempt to choose a name
989 which has no existing file. To make this work,
990 PREFIX should be an absolute file name.
991
992 There is a race condition between calling `make-temp-name' and creating the
993 file which opens all kinds of security holes. For that reason, you should
994 probably use `make-temp-file' instead, except in three circumstances:
995
996 * If you are creating the file in the user's home directory.
997 * If you are creating a directory rather than an ordinary file.
998 * If you are taking special precautions as `make-temp-file' does. */)
999 (prefix)
1000 Lisp_Object prefix;
1001 {
1002 return make_temp_name (prefix, 0);
1003 }
1004
1005
1006 \f
1007 DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
1008 doc: /* Convert filename NAME to absolute, and canonicalize it.
1009 Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative
1010 (does not start with slash); if DEFAULT-DIRECTORY is nil or missing,
1011 the current buffer's value of default-directory is used.
1012 File name components that are `.' are removed, and
1013 so are file name components followed by `..', along with the `..' itself;
1014 note that these simplifications are done without checking the resulting
1015 file names in the file system.
1016 An initial `~/' expands to your home directory.
1017 An initial `~USER/' expands to USER's home directory.
1018 See also the function `substitute-in-file-name'. */)
1019 (name, default_directory)
1020 Lisp_Object name, default_directory;
1021 {
1022 unsigned char *nm;
1023
1024 register unsigned char *newdir, *p, *o;
1025 int tlen;
1026 unsigned char *target;
1027 struct passwd *pw;
1028 #ifdef VMS
1029 unsigned char * colon = 0;
1030 unsigned char * close = 0;
1031 unsigned char * slash = 0;
1032 unsigned char * brack = 0;
1033 int lbrack = 0, rbrack = 0;
1034 int dots = 0;
1035 #endif /* VMS */
1036 #ifdef DOS_NT
1037 int drive = 0;
1038 int collapse_newdir = 1;
1039 int is_escaped = 0;
1040 #endif /* DOS_NT */
1041 int length;
1042 Lisp_Object handler;
1043
1044 CHECK_STRING (name);
1045
1046 /* If the file name has special constructs in it,
1047 call the corresponding file handler. */
1048 handler = Ffind_file_name_handler (name, Qexpand_file_name);
1049 if (!NILP (handler))
1050 return call3 (handler, Qexpand_file_name, name, default_directory);
1051
1052 /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted. */
1053 if (NILP (default_directory))
1054 default_directory = current_buffer->directory;
1055 if (! STRINGP (default_directory))
1056 {
1057 #ifdef DOS_NT
1058 /* "/" is not considered a root directory on DOS_NT, so using "/"
1059 here causes an infinite recursion in, e.g., the following:
1060
1061 (let (default-directory)
1062 (expand-file-name "a"))
1063
1064 To avoid this, we set default_directory to the root of the
1065 current drive. */
1066 extern char *emacs_root_dir (void);
1067
1068 default_directory = build_string (emacs_root_dir ());
1069 #else
1070 default_directory = build_string ("/");
1071 #endif
1072 }
1073
1074 if (!NILP (default_directory))
1075 {
1076 handler = Ffind_file_name_handler (default_directory, Qexpand_file_name);
1077 if (!NILP (handler))
1078 return call3 (handler, Qexpand_file_name, name, default_directory);
1079 }
1080
1081 o = SDATA (default_directory);
1082
1083 /* Make sure DEFAULT_DIRECTORY is properly expanded.
1084 It would be better to do this down below where we actually use
1085 default_directory. Unfortunately, calling Fexpand_file_name recursively
1086 could invoke GC, and the strings might be relocated. This would
1087 be annoying because we have pointers into strings lying around
1088 that would need adjusting, and people would add new pointers to
1089 the code and forget to adjust them, resulting in intermittent bugs.
1090 Putting this call here avoids all that crud.
1091
1092 The EQ test avoids infinite recursion. */
1093 if (! NILP (default_directory) && !EQ (default_directory, name)
1094 /* Save time in some common cases - as long as default_directory
1095 is not relative, it can be canonicalized with name below (if it
1096 is needed at all) without requiring it to be expanded now. */
1097 #ifdef DOS_NT
1098 /* Detect MSDOS file names with drive specifiers. */
1099 && ! (IS_DRIVE (o[0]) && IS_DEVICE_SEP (o[1]) && IS_DIRECTORY_SEP (o[2]))
1100 #ifdef WINDOWSNT
1101 /* Detect Windows file names in UNC format. */
1102 && ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
1103 #endif
1104 #else /* not DOS_NT */
1105 /* Detect Unix absolute file names (/... alone is not absolute on
1106 DOS or Windows). */
1107 && ! (IS_DIRECTORY_SEP (o[0]))
1108 #endif /* not DOS_NT */
1109 )
1110 {
1111 struct gcpro gcpro1;
1112
1113 GCPRO1 (name);
1114 default_directory = Fexpand_file_name (default_directory, Qnil);
1115 UNGCPRO;
1116 }
1117
1118 #ifdef VMS
1119 /* Filenames on VMS are always upper case. */
1120 name = Fupcase (name);
1121 #endif
1122 #ifdef FILE_SYSTEM_CASE
1123 name = FILE_SYSTEM_CASE (name);
1124 #endif
1125
1126 nm = SDATA (name);
1127
1128 #ifdef DOS_NT
1129 /* We will force directory separators to be either all \ or /, so make
1130 a local copy to modify, even if there ends up being no change. */
1131 nm = strcpy (alloca (strlen (nm) + 1), nm);
1132
1133 /* Note if special escape prefix is present, but remove for now. */
1134 if (nm[0] == '/' && nm[1] == ':')
1135 {
1136 is_escaped = 1;
1137 nm += 2;
1138 }
1139
1140 /* Find and remove drive specifier if present; this makes nm absolute
1141 even if the rest of the name appears to be relative. Only look for
1142 drive specifier at the beginning. */
1143 if (IS_DRIVE (nm[0]) && IS_DEVICE_SEP (nm[1]))
1144 {
1145 drive = nm[0];
1146 nm += 2;
1147 }
1148
1149 #ifdef WINDOWSNT
1150 /* If we see "c://somedir", we want to strip the first slash after the
1151 colon when stripping the drive letter. Otherwise, this expands to
1152 "//somedir". */
1153 if (drive && IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
1154 nm++;
1155 #endif /* WINDOWSNT */
1156 #endif /* DOS_NT */
1157
1158 #ifdef WINDOWSNT
1159 /* Discard any previous drive specifier if nm is now in UNC format. */
1160 if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
1161 {
1162 drive = 0;
1163 }
1164 #endif
1165
1166 /* If nm is absolute, look for `/./' or `/../' or `//''sequences; if
1167 none are found, we can probably return right away. We will avoid
1168 allocating a new string if name is already fully expanded. */
1169 if (
1170 IS_DIRECTORY_SEP (nm[0])
1171 #ifdef MSDOS
1172 && drive && !is_escaped
1173 #endif
1174 #ifdef WINDOWSNT
1175 && (drive || IS_DIRECTORY_SEP (nm[1])) && !is_escaped
1176 #endif
1177 #ifdef VMS
1178 || index (nm, ':')
1179 #endif /* VMS */
1180 )
1181 {
1182 /* If it turns out that the filename we want to return is just a
1183 suffix of FILENAME, we don't need to go through and edit
1184 things; we just need to construct a new string using data
1185 starting at the middle of FILENAME. If we set lose to a
1186 non-zero value, that means we've discovered that we can't do
1187 that cool trick. */
1188 int lose = 0;
1189
1190 p = nm;
1191 while (*p)
1192 {
1193 /* Since we know the name is absolute, we can assume that each
1194 element starts with a "/". */
1195
1196 /* "." and ".." are hairy. */
1197 if (IS_DIRECTORY_SEP (p[0])
1198 && p[1] == '.'
1199 && (IS_DIRECTORY_SEP (p[2])
1200 || p[2] == 0
1201 || (p[2] == '.' && (IS_DIRECTORY_SEP (p[3])
1202 || p[3] == 0))))
1203 lose = 1;
1204 /* We want to replace multiple `/' in a row with a single
1205 slash. */
1206 else if (p > nm
1207 && IS_DIRECTORY_SEP (p[0])
1208 && IS_DIRECTORY_SEP (p[1]))
1209 lose = 1;
1210
1211 #ifdef VMS
1212 if (p[0] == '\\')
1213 lose = 1;
1214 if (p[0] == '/') {
1215 /* if dev:[dir]/, move nm to / */
1216 if (!slash && p > nm && (brack || colon)) {
1217 nm = (brack ? brack + 1 : colon + 1);
1218 lbrack = rbrack = 0;
1219 brack = 0;
1220 colon = 0;
1221 }
1222 slash = p;
1223 }
1224 if (p[0] == '-')
1225 #ifndef VMS4_4
1226 /* VMS pre V4.4,convert '-'s in filenames. */
1227 if (lbrack == rbrack)
1228 {
1229 if (dots < 2) /* this is to allow negative version numbers */
1230 p[0] = '_';
1231 }
1232 else
1233 #endif /* VMS4_4 */
1234 if (lbrack > rbrack &&
1235 ((p[-1] == '.' || p[-1] == '[' || p[-1] == '<') &&
1236 (p[1] == '.' || p[1] == ']' || p[1] == '>')))
1237 lose = 1;
1238 #ifndef VMS4_4
1239 else
1240 p[0] = '_';
1241 #endif /* VMS4_4 */
1242 /* count open brackets, reset close bracket pointer */
1243 if (p[0] == '[' || p[0] == '<')
1244 lbrack++, brack = 0;
1245 /* count close brackets, set close bracket pointer */
1246 if (p[0] == ']' || p[0] == '>')
1247 rbrack++, brack = p;
1248 /* detect ][ or >< */
1249 if ((p[0] == ']' || p[0] == '>') && (p[1] == '[' || p[1] == '<'))
1250 lose = 1;
1251 if ((p[0] == ':' || p[0] == ']' || p[0] == '>') && p[1] == '~')
1252 nm = p + 1, lose = 1;
1253 if (p[0] == ':' && (colon || slash))
1254 /* if dev1:[dir]dev2:, move nm to dev2: */
1255 if (brack)
1256 {
1257 nm = brack + 1;
1258 brack = 0;
1259 }
1260 /* if /name/dev:, move nm to dev: */
1261 else if (slash)
1262 nm = slash + 1;
1263 /* if node::dev:, move colon following dev */
1264 else if (colon && colon[-1] == ':')
1265 colon = p;
1266 /* if dev1:dev2:, move nm to dev2: */
1267 else if (colon && colon[-1] != ':')
1268 {
1269 nm = colon + 1;
1270 colon = 0;
1271 }
1272 if (p[0] == ':' && !colon)
1273 {
1274 if (p[1] == ':')
1275 p++;
1276 colon = p;
1277 }
1278 if (lbrack == rbrack)
1279 if (p[0] == ';')
1280 dots = 2;
1281 else if (p[0] == '.')
1282 dots++;
1283 #endif /* VMS */
1284 p++;
1285 }
1286 if (!lose)
1287 {
1288 #ifdef VMS
1289 if (index (nm, '/'))
1290 return build_string (sys_translate_unix (nm));
1291 #endif /* VMS */
1292 #ifdef DOS_NT
1293 /* Make sure directories are all separated with / or \ as
1294 desired, but avoid allocation of a new string when not
1295 required. */
1296 CORRECT_DIR_SEPS (nm);
1297 #ifdef WINDOWSNT
1298 if (IS_DIRECTORY_SEP (nm[1]))
1299 {
1300 if (strcmp (nm, SDATA (name)) != 0)
1301 name = build_string (nm);
1302 }
1303 else
1304 #endif
1305 /* drive must be set, so this is okay */
1306 if (strcmp (nm - 2, SDATA (name)) != 0)
1307 {
1308 name = make_string (nm - 2, p - nm + 2);
1309 SSET (name, 0, DRIVE_LETTER (drive));
1310 SSET (name, 1, ':');
1311 }
1312 return name;
1313 #else /* not DOS_NT */
1314 if (nm == SDATA (name))
1315 return name;
1316 return build_string (nm);
1317 #endif /* not DOS_NT */
1318 }
1319 }
1320
1321 /* At this point, nm might or might not be an absolute file name. We
1322 need to expand ~ or ~user if present, otherwise prefix nm with
1323 default_directory if nm is not absolute, and finally collapse /./
1324 and /foo/../ sequences.
1325
1326 We set newdir to be the appropriate prefix if one is needed:
1327 - the relevant user directory if nm starts with ~ or ~user
1328 - the specified drive's working dir (DOS/NT only) if nm does not
1329 start with /
1330 - the value of default_directory.
1331
1332 Note that these prefixes are not guaranteed to be absolute (except
1333 for the working dir of a drive). Therefore, to ensure we always
1334 return an absolute name, if the final prefix is not absolute we
1335 append it to the current working directory. */
1336
1337 newdir = 0;
1338
1339 if (nm[0] == '~') /* prefix ~ */
1340 {
1341 if (IS_DIRECTORY_SEP (nm[1])
1342 #ifdef VMS
1343 || nm[1] == ':'
1344 #endif /* VMS */
1345 || nm[1] == 0) /* ~ by itself */
1346 {
1347 if (!(newdir = (unsigned char *) egetenv ("HOME")))
1348 newdir = (unsigned char *) "";
1349 nm++;
1350 #ifdef DOS_NT
1351 collapse_newdir = 0;
1352 #endif
1353 #ifdef VMS
1354 nm++; /* Don't leave the slash in nm. */
1355 #endif /* VMS */
1356 }
1357 else /* ~user/filename */
1358 {
1359 for (p = nm; *p && (!IS_DIRECTORY_SEP (*p)
1360 #ifdef VMS
1361 && *p != ':'
1362 #endif /* VMS */
1363 ); p++);
1364 o = (unsigned char *) alloca (p - nm + 1);
1365 bcopy ((char *) nm, o, p - nm);
1366 o [p - nm] = 0;
1367
1368 pw = (struct passwd *) getpwnam (o + 1);
1369 if (pw)
1370 {
1371 newdir = (unsigned char *) pw -> pw_dir;
1372 #ifdef VMS
1373 nm = p + 1; /* skip the terminator */
1374 #else
1375 nm = p;
1376 #ifdef DOS_NT
1377 collapse_newdir = 0;
1378 #endif
1379 #endif /* VMS */
1380 }
1381
1382 /* If we don't find a user of that name, leave the name
1383 unchanged; don't move nm forward to p. */
1384 }
1385 }
1386
1387 #ifdef DOS_NT
1388 /* On DOS and Windows, nm is absolute if a drive name was specified;
1389 use the drive's current directory as the prefix if needed. */
1390 if (!newdir && drive)
1391 {
1392 /* Get default directory if needed to make nm absolute. */
1393 if (!IS_DIRECTORY_SEP (nm[0]))
1394 {
1395 newdir = alloca (MAXPATHLEN + 1);
1396 if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
1397 newdir = NULL;
1398 }
1399 if (!newdir)
1400 {
1401 /* Either nm starts with /, or drive isn't mounted. */
1402 newdir = alloca (4);
1403 newdir[0] = DRIVE_LETTER (drive);
1404 newdir[1] = ':';
1405 newdir[2] = '/';
1406 newdir[3] = 0;
1407 }
1408 }
1409 #endif /* DOS_NT */
1410
1411 /* Finally, if no prefix has been specified and nm is not absolute,
1412 then it must be expanded relative to default_directory. */
1413
1414 if (1
1415 #ifndef DOS_NT
1416 /* /... alone is not absolute on DOS and Windows. */
1417 && !IS_DIRECTORY_SEP (nm[0])
1418 #endif
1419 #ifdef WINDOWSNT
1420 && !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
1421 #endif
1422 #ifdef VMS
1423 && !index (nm, ':')
1424 #endif
1425 && !newdir)
1426 {
1427 newdir = SDATA (default_directory);
1428 #ifdef DOS_NT
1429 /* Note if special escape prefix is present, but remove for now. */
1430 if (newdir[0] == '/' && newdir[1] == ':')
1431 {
1432 is_escaped = 1;
1433 newdir += 2;
1434 }
1435 #endif
1436 }
1437
1438 #ifdef DOS_NT
1439 if (newdir)
1440 {
1441 /* First ensure newdir is an absolute name. */
1442 if (
1443 /* Detect MSDOS file names with drive specifiers. */
1444 ! (IS_DRIVE (newdir[0])
1445 && IS_DEVICE_SEP (newdir[1]) && IS_DIRECTORY_SEP (newdir[2]))
1446 #ifdef WINDOWSNT
1447 /* Detect Windows file names in UNC format. */
1448 && ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1449 #endif
1450 )
1451 {
1452 /* Effectively, let newdir be (expand-file-name newdir cwd).
1453 Because of the admonition against calling expand-file-name
1454 when we have pointers into lisp strings, we accomplish this
1455 indirectly by prepending newdir to nm if necessary, and using
1456 cwd (or the wd of newdir's drive) as the new newdir. */
1457
1458 if (IS_DRIVE (newdir[0]) && newdir[1] == ':')
1459 {
1460 drive = newdir[0];
1461 newdir += 2;
1462 }
1463 if (!IS_DIRECTORY_SEP (nm[0]))
1464 {
1465 char * tmp = alloca (strlen (newdir) + strlen (nm) + 2);
1466 file_name_as_directory (tmp, newdir);
1467 strcat (tmp, nm);
1468 nm = tmp;
1469 }
1470 newdir = alloca (MAXPATHLEN + 1);
1471 if (drive)
1472 {
1473 if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
1474 newdir = "/";
1475 }
1476 else
1477 getwd (newdir);
1478 }
1479
1480 /* Strip off drive name from prefix, if present. */
1481 if (IS_DRIVE (newdir[0]) && newdir[1] == ':')
1482 {
1483 drive = newdir[0];
1484 newdir += 2;
1485 }
1486
1487 /* Keep only a prefix from newdir if nm starts with slash
1488 (//server/share for UNC, nothing otherwise). */
1489 if (IS_DIRECTORY_SEP (nm[0]) && collapse_newdir)
1490 {
1491 #ifdef WINDOWSNT
1492 if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
1493 {
1494 newdir = strcpy (alloca (strlen (newdir) + 1), newdir);
1495 p = newdir + 2;
1496 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1497 p++;
1498 while (*p && !IS_DIRECTORY_SEP (*p)) p++;
1499 *p = 0;
1500 }
1501 else
1502 #endif
1503 newdir = "";
1504 }
1505 }
1506 #endif /* DOS_NT */
1507
1508 if (newdir)
1509 {
1510 /* Get rid of any slash at the end of newdir, unless newdir is
1511 just / or // (an incomplete UNC name). */
1512 length = strlen (newdir);
1513 if (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
1514 #ifdef WINDOWSNT
1515 && !(length == 2 && IS_DIRECTORY_SEP (newdir[0]))
1516 #endif
1517 )
1518 {
1519 unsigned char *temp = (unsigned char *) alloca (length);
1520 bcopy (newdir, temp, length - 1);
1521 temp[length - 1] = 0;
1522 newdir = temp;
1523 }
1524 tlen = length + 1;
1525 }
1526 else
1527 tlen = 0;
1528
1529 /* Now concatenate the directory and name to new space in the stack frame */
1530 tlen += strlen (nm) + 1;
1531 #ifdef DOS_NT
1532 /* Reserve space for drive specifier and escape prefix, since either
1533 or both may need to be inserted. (The Microsoft x86 compiler
1534 produces incorrect code if the following two lines are combined.) */
1535 target = (unsigned char *) alloca (tlen + 4);
1536 target += 4;
1537 #else /* not DOS_NT */
1538 target = (unsigned char *) alloca (tlen);
1539 #endif /* not DOS_NT */
1540 *target = 0;
1541
1542 if (newdir)
1543 {
1544 #ifndef VMS
1545 if (nm[0] == 0 || IS_DIRECTORY_SEP (nm[0]))
1546 {
1547 #ifdef DOS_NT
1548 /* If newdir is effectively "C:/", then the drive letter will have
1549 been stripped and newdir will be "/". Concatenating with an
1550 absolute directory in nm produces "//", which will then be
1551 incorrectly treated as a network share. Ignore newdir in
1552 this case (keeping the drive letter). */
1553 if (!(drive && nm[0] && IS_DIRECTORY_SEP (newdir[0])
1554 && newdir[1] == '\0'))
1555 #endif
1556 strcpy (target, newdir);
1557 }
1558 else
1559 #endif
1560 file_name_as_directory (target, newdir);
1561 }
1562
1563 strcat (target, nm);
1564 #ifdef VMS
1565 if (index (target, '/'))
1566 strcpy (target, sys_translate_unix (target));
1567 #endif /* VMS */
1568
1569 /* ASSERT (IS_DIRECTORY_SEP (target[0])) if not VMS */
1570
1571 /* Now canonicalize by removing `//', `/.' and `/foo/..' if they
1572 appear. */
1573
1574 p = target;
1575 o = target;
1576
1577 while (*p)
1578 {
1579 #ifdef VMS
1580 if (*p != ']' && *p != '>' && *p != '-')
1581 {
1582 if (*p == '\\')
1583 p++;
1584 *o++ = *p++;
1585 }
1586 else if ((p[0] == ']' || p[0] == '>') && p[0] == p[1] + 2)
1587 /* brackets are offset from each other by 2 */
1588 {
1589 p += 2;
1590 if (*p != '.' && *p != '-' && o[-1] != '.')
1591 /* convert [foo][bar] to [bar] */
1592 while (o[-1] != '[' && o[-1] != '<')
1593 o--;
1594 else if (*p == '-' && *o != '.')
1595 *--p = '.';
1596 }
1597 else if (p[0] == '-' && o[-1] == '.' &&
1598 (p[1] == '.' || p[1] == ']' || p[1] == '>'))
1599 /* flush .foo.- ; leave - if stopped by '[' or '<' */
1600 {
1601 do
1602 o--;
1603 while (o[-1] != '.' && o[-1] != '[' && o[-1] != '<');
1604 if (p[1] == '.') /* foo.-.bar ==> bar. */
1605 p += 2;
1606 else if (o[-1] == '.') /* '.foo.-]' ==> ']' */
1607 p++, o--;
1608 /* else [foo.-] ==> [-] */
1609 }
1610 else
1611 {
1612 #ifndef VMS4_4
1613 if (*p == '-' &&
1614 o[-1] != '[' && o[-1] != '<' && o[-1] != '.' &&
1615 p[1] != ']' && p[1] != '>' && p[1] != '.')
1616 *p = '_';
1617 #endif /* VMS4_4 */
1618 *o++ = *p++;
1619 }
1620 #else /* not VMS */
1621 if (!IS_DIRECTORY_SEP (*p))
1622 {
1623 *o++ = *p++;
1624 }
1625 else if (IS_DIRECTORY_SEP (p[0])
1626 && p[1] == '.'
1627 && (IS_DIRECTORY_SEP (p[2])
1628 || p[2] == 0))
1629 {
1630 /* If "/." is the entire filename, keep the "/". Otherwise,
1631 just delete the whole "/.". */
1632 if (o == target && p[2] == '\0')
1633 *o++ = *p;
1634 p += 2;
1635 }
1636 else if (IS_DIRECTORY_SEP (p[0]) && p[1] == '.' && p[2] == '.'
1637 /* `/../' is the "superroot" on certain file systems. */
1638 && o != target
1639 && (IS_DIRECTORY_SEP (p[3]) || p[3] == 0))
1640 {
1641 while (o != target && (--o) && !IS_DIRECTORY_SEP (*o))
1642 ;
1643 /* Keep initial / only if this is the whole name. */
1644 if (o == target && IS_ANY_SEP (*o) && p[3] == 0)
1645 ++o;
1646 p += 3;
1647 }
1648 else if (p > target
1649 && IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1]))
1650 {
1651 /* Collapse multiple `/' in a row. */
1652 *o++ = *p++;
1653 while (IS_DIRECTORY_SEP (*p))
1654 ++p;
1655 }
1656 else
1657 {
1658 *o++ = *p++;
1659 }
1660 #endif /* not VMS */
1661 }
1662
1663 #ifdef DOS_NT
1664 /* At last, set drive name. */
1665 #ifdef WINDOWSNT
1666 /* Except for network file name. */
1667 if (!(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1])))
1668 #endif /* WINDOWSNT */
1669 {
1670 if (!drive) abort ();
1671 target -= 2;
1672 target[0] = DRIVE_LETTER (drive);
1673 target[1] = ':';
1674 }
1675 /* Reinsert the escape prefix if required. */
1676 if (is_escaped)
1677 {
1678 target -= 2;
1679 target[0] = '/';
1680 target[1] = ':';
1681 }
1682 CORRECT_DIR_SEPS (target);
1683 #endif /* DOS_NT */
1684
1685 return make_string (target, o - target);
1686 }
1687
1688 #if 0
1689 /* PLEASE DO NOT DELETE THIS COMMENTED-OUT VERSION!
1690 This is the old version of expand-file-name, before it was thoroughly
1691 rewritten for Emacs 10.31. We leave this version here commented-out,
1692 because the code is very complex and likely to have subtle bugs. If
1693 bugs _are_ found, it might be of interest to look at the old code and
1694 see what did it do in the relevant situation.
1695
1696 Don't remove this code: it's true that it will be accessible via CVS,
1697 but a few years from deletion, people will forget it is there. */
1698
1699 /* Changed this DEFUN to a DEAFUN, so as not to confuse `make-docfile'. */
1700 DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
1701 "Convert FILENAME to absolute, and canonicalize it.\n\
1702 Second arg DEFAULT is directory to start with if FILENAME is relative\n\
1703 (does not start with slash); if DEFAULT is nil or missing,\n\
1704 the current buffer's value of default-directory is used.\n\
1705 Filenames containing `.' or `..' as components are simplified;\n\
1706 initial `~/' expands to your home directory.\n\
1707 See also the function `substitute-in-file-name'.")
1708 (name, defalt)
1709 Lisp_Object name, defalt;
1710 {
1711 unsigned char *nm;
1712
1713 register unsigned char *newdir, *p, *o;
1714 int tlen;
1715 unsigned char *target;
1716 struct passwd *pw;
1717 int lose;
1718 #ifdef VMS
1719 unsigned char * colon = 0;
1720 unsigned char * close = 0;
1721 unsigned char * slash = 0;
1722 unsigned char * brack = 0;
1723 int lbrack = 0, rbrack = 0;
1724 int dots = 0;
1725 #endif /* VMS */
1726
1727 CHECK_STRING (name);
1728
1729 #ifdef VMS
1730 /* Filenames on VMS are always upper case. */
1731 name = Fupcase (name);
1732 #endif
1733
1734 nm = SDATA (name);
1735
1736 /* If nm is absolute, flush ...// and detect /./ and /../.
1737 If no /./ or /../ we can return right away. */
1738 if (
1739 nm[0] == '/'
1740 #ifdef VMS
1741 || index (nm, ':')
1742 #endif /* VMS */
1743 )
1744 {
1745 p = nm;
1746 lose = 0;
1747 while (*p)
1748 {
1749 if (p[0] == '/' && p[1] == '/'
1750 #ifdef APOLLO
1751 /* // at start of filename is meaningful on Apollo system. */
1752 && nm != p
1753 #endif /* APOLLO */
1754 )
1755 nm = p + 1;
1756 if (p[0] == '/' && p[1] == '~')
1757 nm = p + 1, lose = 1;
1758 if (p[0] == '/' && p[1] == '.'
1759 && (p[2] == '/' || p[2] == 0
1760 || (p[2] == '.' && (p[3] == '/' || p[3] == 0))))
1761 lose = 1;
1762 #ifdef VMS
1763 if (p[0] == '\\')
1764 lose = 1;
1765 if (p[0] == '/') {
1766 /* if dev:[dir]/, move nm to / */
1767 if (!slash && p > nm && (brack || colon)) {
1768 nm = (brack ? brack + 1 : colon + 1);
1769 lbrack = rbrack = 0;
1770 brack = 0;
1771 colon = 0;
1772 }
1773 slash = p;
1774 }
1775 if (p[0] == '-')
1776 #ifndef VMS4_4
1777 /* VMS pre V4.4,convert '-'s in filenames. */
1778 if (lbrack == rbrack)
1779 {
1780 if (dots < 2) /* this is to allow negative version numbers */
1781 p[0] = '_';
1782 }
1783 else
1784 #endif /* VMS4_4 */
1785 if (lbrack > rbrack &&
1786 ((p[-1] == '.' || p[-1] == '[' || p[-1] == '<') &&
1787 (p[1] == '.' || p[1] == ']' || p[1] == '>')))
1788 lose = 1;
1789 #ifndef VMS4_4
1790 else
1791 p[0] = '_';
1792 #endif /* VMS4_4 */
1793 /* count open brackets, reset close bracket pointer */
1794 if (p[0] == '[' || p[0] == '<')
1795 lbrack++, brack = 0;
1796 /* count close brackets, set close bracket pointer */
1797 if (p[0] == ']' || p[0] == '>')
1798 rbrack++, brack = p;
1799 /* detect ][ or >< */
1800 if ((p[0] == ']' || p[0] == '>') && (p[1] == '[' || p[1] == '<'))
1801 lose = 1;
1802 if ((p[0] == ':' || p[0] == ']' || p[0] == '>') && p[1] == '~')
1803 nm = p + 1, lose = 1;
1804 if (p[0] == ':' && (colon || slash))
1805 /* if dev1:[dir]dev2:, move nm to dev2: */
1806 if (brack)
1807 {
1808 nm = brack + 1;
1809 brack = 0;
1810 }
1811 /* If /name/dev:, move nm to dev: */
1812 else if (slash)
1813 nm = slash + 1;
1814 /* If node::dev:, move colon following dev */
1815 else if (colon && colon[-1] == ':')
1816 colon = p;
1817 /* If dev1:dev2:, move nm to dev2: */
1818 else if (colon && colon[-1] != ':')
1819 {
1820 nm = colon + 1;
1821 colon = 0;
1822 }
1823 if (p[0] == ':' && !colon)
1824 {
1825 if (p[1] == ':')
1826 p++;
1827 colon = p;
1828 }
1829 if (lbrack == rbrack)
1830 if (p[0] == ';')
1831 dots = 2;
1832 else if (p[0] == '.')
1833 dots++;
1834 #endif /* VMS */
1835 p++;
1836 }
1837 if (!lose)
1838 {
1839 #ifdef VMS
1840 if (index (nm, '/'))
1841 return build_string (sys_translate_unix (nm));
1842 #endif /* VMS */
1843 if (nm == SDATA (name))
1844 return name;
1845 return build_string (nm);
1846 }
1847 }
1848
1849 /* Now determine directory to start with and put it in NEWDIR */
1850
1851 newdir = 0;
1852
1853 if (nm[0] == '~') /* prefix ~ */
1854 if (nm[1] == '/'
1855 #ifdef VMS
1856 || nm[1] == ':'
1857 #endif /* VMS */
1858 || nm[1] == 0)/* ~/filename */
1859 {
1860 if (!(newdir = (unsigned char *) egetenv ("HOME")))
1861 newdir = (unsigned char *) "";
1862 nm++;
1863 #ifdef VMS
1864 nm++; /* Don't leave the slash in nm. */
1865 #endif /* VMS */
1866 }
1867 else /* ~user/filename */
1868 {
1869 /* Get past ~ to user */
1870 unsigned char *user = nm + 1;
1871 /* Find end of name. */
1872 unsigned char *ptr = (unsigned char *) index (user, '/');
1873 int len = ptr ? ptr - user : strlen (user);
1874 #ifdef VMS
1875 unsigned char *ptr1 = index (user, ':');
1876 if (ptr1 != 0 && ptr1 - user < len)
1877 len = ptr1 - user;
1878 #endif /* VMS */
1879 /* Copy the user name into temp storage. */
1880 o = (unsigned char *) alloca (len + 1);
1881 bcopy ((char *) user, o, len);
1882 o[len] = 0;
1883
1884 /* Look up the user name. */
1885 pw = (struct passwd *) getpwnam (o + 1);
1886 if (!pw)
1887 error ("\"%s\" isn't a registered user", o + 1);
1888
1889 newdir = (unsigned char *) pw->pw_dir;
1890
1891 /* Discard the user name from NM. */
1892 nm += len;
1893 }
1894
1895 if (nm[0] != '/'
1896 #ifdef VMS
1897 && !index (nm, ':')
1898 #endif /* not VMS */
1899 && !newdir)
1900 {
1901 if (NILP (defalt))
1902 defalt = current_buffer->directory;
1903 CHECK_STRING (defalt);
1904 newdir = SDATA (defalt);
1905 }
1906
1907 /* Now concatenate the directory and name to new space in the stack frame */
1908
1909 tlen = (newdir ? strlen (newdir) + 1 : 0) + strlen (nm) + 1;
1910 target = (unsigned char *) alloca (tlen);
1911 *target = 0;
1912
1913 if (newdir)
1914 {
1915 #ifndef VMS
1916 if (nm[0] == 0 || nm[0] == '/')
1917 strcpy (target, newdir);
1918 else
1919 #endif
1920 file_name_as_directory (target, newdir);
1921 }
1922
1923 strcat (target, nm);
1924 #ifdef VMS
1925 if (index (target, '/'))
1926 strcpy (target, sys_translate_unix (target));
1927 #endif /* VMS */
1928
1929 /* Now canonicalize by removing /. and /foo/.. if they appear */
1930
1931 p = target;
1932 o = target;
1933
1934 while (*p)
1935 {
1936 #ifdef VMS
1937 if (*p != ']' && *p != '>' && *p != '-')
1938 {
1939 if (*p == '\\')
1940 p++;
1941 *o++ = *p++;
1942 }
1943 else if ((p[0] == ']' || p[0] == '>') && p[0] == p[1] + 2)
1944 /* brackets are offset from each other by 2 */
1945 {
1946 p += 2;
1947 if (*p != '.' && *p != '-' && o[-1] != '.')
1948 /* convert [foo][bar] to [bar] */
1949 while (o[-1] != '[' && o[-1] != '<')
1950 o--;
1951 else if (*p == '-' && *o != '.')
1952 *--p = '.';
1953 }
1954 else if (p[0] == '-' && o[-1] == '.' &&
1955 (p[1] == '.' || p[1] == ']' || p[1] == '>'))
1956 /* flush .foo.- ; leave - if stopped by '[' or '<' */
1957 {
1958 do
1959 o--;
1960 while (o[-1] != '.' && o[-1] != '[' && o[-1] != '<');
1961 if (p[1] == '.') /* foo.-.bar ==> bar. */
1962 p += 2;
1963 else if (o[-1] == '.') /* '.foo.-]' ==> ']' */
1964 p++, o--;
1965 /* else [foo.-] ==> [-] */
1966 }
1967 else
1968 {
1969 #ifndef VMS4_4
1970 if (*p == '-' &&
1971 o[-1] != '[' && o[-1] != '<' && o[-1] != '.' &&
1972 p[1] != ']' && p[1] != '>' && p[1] != '.')
1973 *p = '_';
1974 #endif /* VMS4_4 */
1975 *o++ = *p++;
1976 }
1977 #else /* not VMS */
1978 if (*p != '/')
1979 {
1980 *o++ = *p++;
1981 }
1982 else if (!strncmp (p, "//", 2)
1983 #ifdef APOLLO
1984 /* // at start of filename is meaningful in Apollo system. */
1985 && o != target
1986 #endif /* APOLLO */
1987 )
1988 {
1989 o = target;
1990 p++;
1991 }
1992 else if (p[0] == '/' && p[1] == '.' &&
1993 (p[2] == '/' || p[2] == 0))
1994 p += 2;
1995 else if (!strncmp (p, "/..", 3)
1996 /* `/../' is the "superroot" on certain file systems. */
1997 && o != target
1998 && (p[3] == '/' || p[3] == 0))
1999 {
2000 while (o != target && *--o != '/')
2001 ;
2002 #ifdef APOLLO
2003 if (o == target + 1 && o[-1] == '/' && o[0] == '/')
2004 ++o;
2005 else
2006 #endif /* APOLLO */
2007 if (o == target && *o == '/')
2008 ++o;
2009 p += 3;
2010 }
2011 else
2012 {
2013 *o++ = *p++;
2014 }
2015 #endif /* not VMS */
2016 }
2017
2018 return make_string (target, o - target);
2019 }
2020 #endif
2021 \f
2022 DEFUN ("substitute-in-file-name", Fsubstitute_in_file_name,
2023 Ssubstitute_in_file_name, 1, 1, 0,
2024 doc: /* Substitute environment variables referred to in FILENAME.
2025 `$FOO' where FOO is an environment variable name means to substitute
2026 the value of that variable. The variable name should be terminated
2027 with a character not a letter, digit or underscore; otherwise, enclose
2028 the entire variable name in braces.
2029 If `/~' appears, all of FILENAME through that `/' is discarded.
2030
2031 On VMS, `$' substitution is not done; this function does little and only
2032 duplicates what `expand-file-name' does. */)
2033 (filename)
2034 Lisp_Object filename;
2035 {
2036 unsigned char *nm;
2037
2038 register unsigned char *s, *p, *o, *x, *endp;
2039 unsigned char *target = NULL;
2040 int total = 0;
2041 int substituted = 0;
2042 unsigned char *xnm;
2043 struct passwd *pw;
2044 Lisp_Object handler;
2045
2046 CHECK_STRING (filename);
2047
2048 /* If the file name has special constructs in it,
2049 call the corresponding file handler. */
2050 handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
2051 if (!NILP (handler))
2052 return call2 (handler, Qsubstitute_in_file_name, filename);
2053
2054 nm = SDATA (filename);
2055 #ifdef DOS_NT
2056 nm = strcpy (alloca (strlen (nm) + 1), nm);
2057 CORRECT_DIR_SEPS (nm);
2058 substituted = (strcmp (nm, SDATA (filename)) != 0);
2059 #endif
2060 endp = nm + SBYTES (filename);
2061
2062 /* If /~ or // appears, discard everything through first slash. */
2063
2064 for (p = nm; p != endp; p++)
2065 {
2066 if ((p[0] == '~'
2067 #if defined (APOLLO) || defined (WINDOWSNT)
2068 /* // at start of file name is meaningful in Apollo and
2069 WindowsNT systems. */
2070 || (IS_DIRECTORY_SEP (p[0]) && p - 1 != nm)
2071 #else /* not (APOLLO || WINDOWSNT) */
2072 || IS_DIRECTORY_SEP (p[0])
2073 #endif /* not (APOLLO || WINDOWSNT) */
2074 )
2075 && p != nm
2076 && (0
2077 #ifdef VMS
2078 || p[-1] == ':' || p[-1] == ']' || p[-1] == '>'
2079 #endif /* VMS */
2080 || IS_DIRECTORY_SEP (p[-1])))
2081 {
2082 for (s = p; *s && (!IS_DIRECTORY_SEP (*s)
2083 #ifdef VMS
2084 && *s != ':'
2085 #endif /* VMS */
2086 ); s++);
2087 if (p[0] == '~' && s > p + 1) /* we've got "/~something/" */
2088 {
2089 o = (unsigned char *) alloca (s - p + 1);
2090 bcopy ((char *) p, o, s - p);
2091 o [s - p] = 0;
2092
2093 pw = (struct passwd *) getpwnam (o + 1);
2094 }
2095 /* If we have ~/ or ~user and `user' exists, discard
2096 everything up to ~. But if `user' does not exist, leave
2097 ~user alone, it might be a literal file name. */
2098 if (IS_DIRECTORY_SEP (p[0]) || s == p + 1 || pw)
2099 {
2100 nm = p;
2101 substituted = 1;
2102 }
2103 }
2104 #ifdef DOS_NT
2105 /* see comment in expand-file-name about drive specifiers */
2106 else if (IS_DRIVE (p[0]) && p[1] == ':'
2107 && p > nm && IS_DIRECTORY_SEP (p[-1]))
2108 {
2109 nm = p;
2110 substituted = 1;
2111 }
2112 #endif /* DOS_NT */
2113 }
2114
2115 #ifdef VMS
2116 return build_string (nm);
2117 #else
2118
2119 /* See if any variables are substituted into the string
2120 and find the total length of their values in `total' */
2121
2122 for (p = nm; p != endp;)
2123 if (*p != '$')
2124 p++;
2125 else
2126 {
2127 p++;
2128 if (p == endp)
2129 goto badsubst;
2130 else if (*p == '$')
2131 {
2132 /* "$$" means a single "$" */
2133 p++;
2134 total -= 1;
2135 substituted = 1;
2136 continue;
2137 }
2138 else if (*p == '{')
2139 {
2140 o = ++p;
2141 while (p != endp && *p != '}') p++;
2142 if (*p != '}') goto missingclose;
2143 s = p;
2144 }
2145 else
2146 {
2147 o = p;
2148 while (p != endp && (isalnum (*p) || *p == '_')) p++;
2149 s = p;
2150 }
2151
2152 /* Copy out the variable name */
2153 target = (unsigned char *) alloca (s - o + 1);
2154 strncpy (target, o, s - o);
2155 target[s - o] = 0;
2156 #ifdef DOS_NT
2157 strupr (target); /* $home == $HOME etc. */
2158 #endif /* DOS_NT */
2159
2160 /* Get variable value */
2161 o = (unsigned char *) egetenv (target);
2162 if (o)
2163 {
2164 total += strlen (o);
2165 substituted = 1;
2166 }
2167 else if (*p == '}')
2168 goto badvar;
2169 }
2170
2171 if (!substituted)
2172 return filename;
2173
2174 /* If substitution required, recopy the string and do it */
2175 /* Make space in stack frame for the new copy */
2176 xnm = (unsigned char *) alloca (SBYTES (filename) + total + 1);
2177 x = xnm;
2178
2179 /* Copy the rest of the name through, replacing $ constructs with values */
2180 for (p = nm; *p;)
2181 if (*p != '$')
2182 *x++ = *p++;
2183 else
2184 {
2185 p++;
2186 if (p == endp)
2187 goto badsubst;
2188 else if (*p == '$')
2189 {
2190 *x++ = *p++;
2191 continue;
2192 }
2193 else if (*p == '{')
2194 {
2195 o = ++p;
2196 while (p != endp && *p != '}') p++;
2197 if (*p != '}') goto missingclose;
2198 s = p++;
2199 }
2200 else
2201 {
2202 o = p;
2203 while (p != endp && (isalnum (*p) || *p == '_')) p++;
2204 s = p;
2205 }
2206
2207 /* Copy out the variable name */
2208 target = (unsigned char *) alloca (s - o + 1);
2209 strncpy (target, o, s - o);
2210 target[s - o] = 0;
2211 #ifdef DOS_NT
2212 strupr (target); /* $home == $HOME etc. */
2213 #endif /* DOS_NT */
2214
2215 /* Get variable value */
2216 o = (unsigned char *) egetenv (target);
2217 if (!o)
2218 {
2219 *x++ = '$';
2220 strcpy (x, target); x+= strlen (target);
2221 }
2222 else if (STRING_MULTIBYTE (filename))
2223 {
2224 /* If the original string is multibyte,
2225 convert what we substitute into multibyte. */
2226 while (*o)
2227 {
2228 int c = unibyte_char_to_multibyte (*o++);
2229 x += CHAR_STRING (c, x);
2230 }
2231 }
2232 else
2233 {
2234 strcpy (x, o);
2235 x += strlen (o);
2236 }
2237 }
2238
2239 *x = 0;
2240
2241 /* If /~ or // appears, discard everything through first slash. */
2242
2243 for (p = xnm; p != x; p++)
2244 if ((p[0] == '~'
2245 #if defined (APOLLO) || defined (WINDOWSNT)
2246 || (IS_DIRECTORY_SEP (p[0]) && p - 1 != xnm)
2247 #else /* not (APOLLO || WINDOWSNT) */
2248 || IS_DIRECTORY_SEP (p[0])
2249 #endif /* not (APOLLO || WINDOWSNT) */
2250 )
2251 && p != xnm && IS_DIRECTORY_SEP (p[-1]))
2252 xnm = p;
2253 #ifdef DOS_NT
2254 else if (IS_DRIVE (p[0]) && p[1] == ':'
2255 && p > xnm && IS_DIRECTORY_SEP (p[-1]))
2256 xnm = p;
2257 #endif
2258
2259 if (STRING_MULTIBYTE (filename))
2260 return make_string (xnm, x - xnm);
2261 return make_unibyte_string (xnm, x - xnm);
2262
2263 badsubst:
2264 error ("Bad format environment-variable substitution");
2265 missingclose:
2266 error ("Missing \"}\" in environment-variable substitution");
2267 badvar:
2268 error ("Substituting nonexistent environment variable \"%s\"", target);
2269
2270 /* NOTREACHED */
2271 #endif /* not VMS */
2272 return Qnil;
2273 }
2274 \f
2275 /* A slightly faster and more convenient way to get
2276 (directory-file-name (expand-file-name FOO)). */
2277
2278 Lisp_Object
2279 expand_and_dir_to_file (filename, defdir)
2280 Lisp_Object filename, defdir;
2281 {
2282 register Lisp_Object absname;
2283
2284 absname = Fexpand_file_name (filename, defdir);
2285 #ifdef VMS
2286 {
2287 register int c = SREF (absname, SBYTES (absname) - 1);
2288 if (c == ':' || c == ']' || c == '>')
2289 absname = Fdirectory_file_name (absname);
2290 }
2291 #else
2292 /* Remove final slash, if any (unless this is the root dir).
2293 stat behaves differently depending! */
2294 if (SCHARS (absname) > 1
2295 && IS_DIRECTORY_SEP (SREF (absname, SBYTES (absname) - 1))
2296 && !IS_DEVICE_SEP (SREF (absname, SBYTES (absname)-2)))
2297 /* We cannot take shortcuts; they might be wrong for magic file names. */
2298 absname = Fdirectory_file_name (absname);
2299 #endif
2300 return absname;
2301 }
2302 \f
2303 /* Signal an error if the file ABSNAME already exists.
2304 If INTERACTIVE is nonzero, ask the user whether to proceed,
2305 and bypass the error if the user says to go ahead.
2306 QUERYSTRING is a name for the action that is being considered
2307 to alter the file.
2308
2309 *STATPTR is used to store the stat information if the file exists.
2310 If the file does not exist, STATPTR->st_mode is set to 0.
2311 If STATPTR is null, we don't store into it.
2312
2313 If QUICK is nonzero, we ask for y or n, not yes or no. */
2314
2315 void
2316 barf_or_query_if_file_exists (absname, querystring, interactive, statptr, quick)
2317 Lisp_Object absname;
2318 unsigned char *querystring;
2319 int interactive;
2320 struct stat *statptr;
2321 int quick;
2322 {
2323 register Lisp_Object tem, encoded_filename;
2324 struct stat statbuf;
2325 struct gcpro gcpro1;
2326
2327 encoded_filename = ENCODE_FILE (absname);
2328
2329 /* stat is a good way to tell whether the file exists,
2330 regardless of what access permissions it has. */
2331 if (stat (SDATA (encoded_filename), &statbuf) >= 0)
2332 {
2333 if (! interactive)
2334 Fsignal (Qfile_already_exists,
2335 Fcons (build_string ("File already exists"),
2336 Fcons (absname, Qnil)));
2337 GCPRO1 (absname);
2338 tem = format1 ("File %s already exists; %s anyway? ",
2339 SDATA (absname), querystring);
2340 if (quick)
2341 tem = Fy_or_n_p (tem);
2342 else
2343 tem = do_yes_or_no_p (tem);
2344 UNGCPRO;
2345 if (NILP (tem))
2346 Fsignal (Qfile_already_exists,
2347 Fcons (build_string ("File already exists"),
2348 Fcons (absname, Qnil)));
2349 if (statptr)
2350 *statptr = statbuf;
2351 }
2352 else
2353 {
2354 if (statptr)
2355 statptr->st_mode = 0;
2356 }
2357 return;
2358 }
2359
2360 DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 4,
2361 "fCopy file: \nFCopy %s to file: \np\nP",
2362 doc: /* Copy FILE to NEWNAME. Both args must be strings.
2363 If NEWNAME names a directory, copy FILE there.
2364 Signals a `file-already-exists' error if file NEWNAME already exists,
2365 unless a third argument OK-IF-ALREADY-EXISTS is supplied and non-nil.
2366 A number as third arg means request confirmation if NEWNAME already exists.
2367 This is what happens in interactive use with M-x.
2368 Fourth arg KEEP-TIME non-nil means give the new file the same
2369 last-modified time as the old one. (This works on only some systems.)
2370 A prefix arg makes KEEP-TIME non-nil. */)
2371 (file, newname, ok_if_already_exists, keep_time)
2372 Lisp_Object file, newname, ok_if_already_exists, keep_time;
2373 {
2374 int ifd, ofd, n;
2375 char buf[16 * 1024];
2376 struct stat st, out_st;
2377 Lisp_Object handler;
2378 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2379 int count = SPECPDL_INDEX ();
2380 int input_file_statable_p;
2381 Lisp_Object encoded_file, encoded_newname;
2382
2383 encoded_file = encoded_newname = Qnil;
2384 GCPRO4 (file, newname, encoded_file, encoded_newname);
2385 CHECK_STRING (file);
2386 CHECK_STRING (newname);
2387
2388 if (!NILP (Ffile_directory_p (newname)))
2389 newname = Fexpand_file_name (file, newname);
2390 else
2391 newname = Fexpand_file_name (newname, Qnil);
2392
2393 file = Fexpand_file_name (file, Qnil);
2394
2395 /* If the input file name has special constructs in it,
2396 call the corresponding file handler. */
2397 handler = Ffind_file_name_handler (file, Qcopy_file);
2398 /* Likewise for output file name. */
2399 if (NILP (handler))
2400 handler = Ffind_file_name_handler (newname, Qcopy_file);
2401 if (!NILP (handler))
2402 RETURN_UNGCPRO (call5 (handler, Qcopy_file, file, newname,
2403 ok_if_already_exists, keep_time));
2404
2405 encoded_file = ENCODE_FILE (file);
2406 encoded_newname = ENCODE_FILE (newname);
2407
2408 if (NILP (ok_if_already_exists)
2409 || INTEGERP (ok_if_already_exists))
2410 barf_or_query_if_file_exists (encoded_newname, "copy to it",
2411 INTEGERP (ok_if_already_exists), &out_st, 0);
2412 else if (stat (SDATA (encoded_newname), &out_st) < 0)
2413 out_st.st_mode = 0;
2414
2415 #ifdef WINDOWSNT
2416 if (!CopyFile (SDATA (encoded_file),
2417 SDATA (encoded_newname),
2418 FALSE))
2419 report_file_error ("Copying file", Fcons (file, Fcons (newname, Qnil)));
2420 else if (!NILP (keep_time))
2421 {
2422 EMACS_TIME now;
2423 DWORD attributes;
2424 char * filename;
2425
2426 EMACS_GET_TIME (now);
2427 filename = SDATA (encoded_newname);
2428
2429 /* Ensure file is writable while its modified time is set. */
2430 attributes = GetFileAttributes (filename);
2431 SetFileAttributes (filename, attributes & ~FILE_ATTRIBUTE_READONLY);
2432 if (set_file_times (filename, now, now))
2433 {
2434 /* Restore original attributes. */
2435 SetFileAttributes (filename, attributes);
2436 Fsignal (Qfile_date_error,
2437 Fcons (build_string ("Cannot set file date"),
2438 Fcons (newname, Qnil)));
2439 }
2440 /* Restore original attributes. */
2441 SetFileAttributes (filename, attributes);
2442 }
2443 #else /* not WINDOWSNT */
2444 ifd = emacs_open (SDATA (encoded_file), O_RDONLY, 0);
2445 if (ifd < 0)
2446 report_file_error ("Opening input file", Fcons (file, Qnil));
2447
2448 record_unwind_protect (close_file_unwind, make_number (ifd));
2449
2450 /* We can only copy regular files and symbolic links. Other files are not
2451 copyable by us. */
2452 input_file_statable_p = (fstat (ifd, &st) >= 0);
2453
2454 #if !defined (DOS_NT) || __DJGPP__ > 1
2455 if (out_st.st_mode != 0
2456 && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
2457 {
2458 errno = 0;
2459 report_file_error ("Input and output files are the same",
2460 Fcons (file, Fcons (newname, Qnil)));
2461 }
2462 #endif
2463
2464 #if defined (S_ISREG) && defined (S_ISLNK)
2465 if (input_file_statable_p)
2466 {
2467 if (!(S_ISREG (st.st_mode)) && !(S_ISLNK (st.st_mode)))
2468 {
2469 #if defined (EISDIR)
2470 /* Get a better looking error message. */
2471 errno = EISDIR;
2472 #endif /* EISDIR */
2473 report_file_error ("Non-regular file", Fcons (file, Qnil));
2474 }
2475 }
2476 #endif /* S_ISREG && S_ISLNK */
2477
2478 #ifdef VMS
2479 /* Create the copy file with the same record format as the input file */
2480 ofd = sys_creat (SDATA (encoded_newname), 0666, ifd);
2481 #else
2482 #ifdef MSDOS
2483 /* System's default file type was set to binary by _fmode in emacs.c. */
2484 ofd = creat (SDATA (encoded_newname), S_IREAD | S_IWRITE);
2485 #else /* not MSDOS */
2486 ofd = creat (SDATA (encoded_newname), 0666);
2487 #endif /* not MSDOS */
2488 #endif /* VMS */
2489 if (ofd < 0)
2490 report_file_error ("Opening output file", Fcons (newname, Qnil));
2491
2492 record_unwind_protect (close_file_unwind, make_number (ofd));
2493
2494 immediate_quit = 1;
2495 QUIT;
2496 while ((n = emacs_read (ifd, buf, sizeof buf)) > 0)
2497 if (emacs_write (ofd, buf, n) != n)
2498 report_file_error ("I/O error", Fcons (newname, Qnil));
2499 immediate_quit = 0;
2500
2501 /* Closing the output clobbers the file times on some systems. */
2502 if (emacs_close (ofd) < 0)
2503 report_file_error ("I/O error", Fcons (newname, Qnil));
2504
2505 if (input_file_statable_p)
2506 {
2507 if (!NILP (keep_time))
2508 {
2509 EMACS_TIME atime, mtime;
2510 EMACS_SET_SECS_USECS (atime, st.st_atime, 0);
2511 EMACS_SET_SECS_USECS (mtime, st.st_mtime, 0);
2512 if (set_file_times (SDATA (encoded_newname),
2513 atime, mtime))
2514 Fsignal (Qfile_date_error,
2515 Fcons (build_string ("Cannot set file date"),
2516 Fcons (newname, Qnil)));
2517 }
2518 #ifndef MSDOS
2519 chmod (SDATA (encoded_newname), st.st_mode & 07777);
2520 #else /* MSDOS */
2521 #if defined (__DJGPP__) && __DJGPP__ > 1
2522 /* In DJGPP v2.0 and later, fstat usually returns true file mode bits,
2523 and if it can't, it tells so. Otherwise, under MSDOS we usually
2524 get only the READ bit, which will make the copied file read-only,
2525 so it's better not to chmod at all. */
2526 if ((_djstat_flags & _STFAIL_WRITEBIT) == 0)
2527 chmod (SDATA (encoded_newname), st.st_mode & 07777);
2528 #endif /* DJGPP version 2 or newer */
2529 #endif /* MSDOS */
2530 }
2531
2532 emacs_close (ifd);
2533 #endif /* WINDOWSNT */
2534
2535 /* Discard the unwind protects. */
2536 specpdl_ptr = specpdl + count;
2537
2538 UNGCPRO;
2539 return Qnil;
2540 }
2541 \f
2542 DEFUN ("make-directory-internal", Fmake_directory_internal,
2543 Smake_directory_internal, 1, 1, 0,
2544 doc: /* Create a new directory named DIRECTORY. */)
2545 (directory)
2546 Lisp_Object directory;
2547 {
2548 const unsigned char *dir;
2549 Lisp_Object handler;
2550 Lisp_Object encoded_dir;
2551
2552 CHECK_STRING (directory);
2553 directory = Fexpand_file_name (directory, Qnil);
2554
2555 handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
2556 if (!NILP (handler))
2557 return call2 (handler, Qmake_directory_internal, directory);
2558
2559 encoded_dir = ENCODE_FILE (directory);
2560
2561 dir = SDATA (encoded_dir);
2562
2563 #ifdef WINDOWSNT
2564 if (mkdir (dir) != 0)
2565 #else
2566 if (mkdir (dir, 0777) != 0)
2567 #endif
2568 report_file_error ("Creating directory", Flist (1, &directory));
2569
2570 return Qnil;
2571 }
2572
2573 DEFUN ("delete-directory", Fdelete_directory, Sdelete_directory, 1, 1, "FDelete directory: ",
2574 doc: /* Delete the directory named DIRECTORY. */)
2575 (directory)
2576 Lisp_Object directory;
2577 {
2578 const unsigned char *dir;
2579 Lisp_Object handler;
2580 Lisp_Object encoded_dir;
2581
2582 CHECK_STRING (directory);
2583 directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil));
2584
2585 handler = Ffind_file_name_handler (directory, Qdelete_directory);
2586 if (!NILP (handler))
2587 return call2 (handler, Qdelete_directory, directory);
2588
2589 encoded_dir = ENCODE_FILE (directory);
2590
2591 dir = SDATA (encoded_dir);
2592
2593 if (rmdir (dir) != 0)
2594 report_file_error ("Removing directory", Flist (1, &directory));
2595
2596 return Qnil;
2597 }
2598
2599 DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 1, "fDelete file: ",
2600 doc: /* Delete file named FILENAME.
2601 If file has multiple names, it continues to exist with the other names. */)
2602 (filename)
2603 Lisp_Object filename;
2604 {
2605 Lisp_Object handler;
2606 Lisp_Object encoded_file;
2607
2608 CHECK_STRING (filename);
2609 filename = Fexpand_file_name (filename, Qnil);
2610
2611 handler = Ffind_file_name_handler (filename, Qdelete_file);
2612 if (!NILP (handler))
2613 return call2 (handler, Qdelete_file, filename);
2614
2615 encoded_file = ENCODE_FILE (filename);
2616
2617 if (0 > unlink (SDATA (encoded_file)))
2618 report_file_error ("Removing old name", Flist (1, &filename));
2619 return Qnil;
2620 }
2621
2622 static Lisp_Object
2623 internal_delete_file_1 (ignore)
2624 Lisp_Object ignore;
2625 {
2626 return Qt;
2627 }
2628
2629 /* Delete file FILENAME, returning 1 if successful and 0 if failed. */
2630
2631 int
2632 internal_delete_file (filename)
2633 Lisp_Object filename;
2634 {
2635 return NILP (internal_condition_case_1 (Fdelete_file, filename,
2636 Qt, internal_delete_file_1));
2637 }
2638 \f
2639 DEFUN ("rename-file", Frename_file, Srename_file, 2, 3,
2640 "fRename file: \nFRename %s to file: \np",
2641 doc: /* Rename FILE as NEWNAME. Both args strings.
2642 If file has names other than FILE, it continues to have those names.
2643 Signals a `file-already-exists' error if a file NEWNAME already exists
2644 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2645 A number as third arg means request confirmation if NEWNAME already exists.
2646 This is what happens in interactive use with M-x. */)
2647 (file, newname, ok_if_already_exists)
2648 Lisp_Object file, newname, ok_if_already_exists;
2649 {
2650 #ifdef NO_ARG_ARRAY
2651 Lisp_Object args[2];
2652 #endif
2653 Lisp_Object handler;
2654 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2655 Lisp_Object encoded_file, encoded_newname;
2656
2657 encoded_file = encoded_newname = Qnil;
2658 GCPRO4 (file, newname, encoded_file, encoded_newname);
2659 CHECK_STRING (file);
2660 CHECK_STRING (newname);
2661 file = Fexpand_file_name (file, Qnil);
2662 newname = Fexpand_file_name (newname, Qnil);
2663
2664 /* If the file name has special constructs in it,
2665 call the corresponding file handler. */
2666 handler = Ffind_file_name_handler (file, Qrename_file);
2667 if (NILP (handler))
2668 handler = Ffind_file_name_handler (newname, Qrename_file);
2669 if (!NILP (handler))
2670 RETURN_UNGCPRO (call4 (handler, Qrename_file,
2671 file, newname, ok_if_already_exists));
2672
2673 encoded_file = ENCODE_FILE (file);
2674 encoded_newname = ENCODE_FILE (newname);
2675
2676 #ifdef DOS_NT
2677 /* If the file names are identical but for the case, don't ask for
2678 confirmation: they simply want to change the letter-case of the
2679 file name. */
2680 if (NILP (Fstring_equal (Fdowncase (file), Fdowncase (newname))))
2681 #endif
2682 if (NILP (ok_if_already_exists)
2683 || INTEGERP (ok_if_already_exists))
2684 barf_or_query_if_file_exists (encoded_newname, "rename to it",
2685 INTEGERP (ok_if_already_exists), 0, 0);
2686 #ifndef BSD4_1
2687 if (0 > rename (SDATA (encoded_file), SDATA (encoded_newname)))
2688 #else
2689 if (0 > link (SDATA (encoded_file), SDATA (encoded_newname))
2690 || 0 > unlink (SDATA (encoded_file)))
2691 #endif
2692 {
2693 if (errno == EXDEV)
2694 {
2695 Fcopy_file (file, newname,
2696 /* We have already prompted if it was an integer,
2697 so don't have copy-file prompt again. */
2698 NILP (ok_if_already_exists) ? Qnil : Qt, Qt);
2699 Fdelete_file (file);
2700 }
2701 else
2702 #ifdef NO_ARG_ARRAY
2703 {
2704 args[0] = file;
2705 args[1] = newname;
2706 report_file_error ("Renaming", Flist (2, args));
2707 }
2708 #else
2709 report_file_error ("Renaming", Flist (2, &file));
2710 #endif
2711 }
2712 UNGCPRO;
2713 return Qnil;
2714 }
2715
2716 DEFUN ("add-name-to-file", Fadd_name_to_file, Sadd_name_to_file, 2, 3,
2717 "fAdd name to file: \nFName to add to %s: \np",
2718 doc: /* Give FILE additional name NEWNAME. Both args strings.
2719 Signals a `file-already-exists' error if a file NEWNAME already exists
2720 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2721 A number as third arg means request confirmation if NEWNAME already exists.
2722 This is what happens in interactive use with M-x. */)
2723 (file, newname, ok_if_already_exists)
2724 Lisp_Object file, newname, ok_if_already_exists;
2725 {
2726 #ifdef NO_ARG_ARRAY
2727 Lisp_Object args[2];
2728 #endif
2729 Lisp_Object handler;
2730 Lisp_Object encoded_file, encoded_newname;
2731 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2732
2733 GCPRO4 (file, newname, encoded_file, encoded_newname);
2734 encoded_file = encoded_newname = Qnil;
2735 CHECK_STRING (file);
2736 CHECK_STRING (newname);
2737 file = Fexpand_file_name (file, Qnil);
2738 newname = Fexpand_file_name (newname, Qnil);
2739
2740 /* If the file name has special constructs in it,
2741 call the corresponding file handler. */
2742 handler = Ffind_file_name_handler (file, Qadd_name_to_file);
2743 if (!NILP (handler))
2744 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
2745 newname, ok_if_already_exists));
2746
2747 /* If the new name has special constructs in it,
2748 call the corresponding file handler. */
2749 handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
2750 if (!NILP (handler))
2751 RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
2752 newname, ok_if_already_exists));
2753
2754 encoded_file = ENCODE_FILE (file);
2755 encoded_newname = ENCODE_FILE (newname);
2756
2757 if (NILP (ok_if_already_exists)
2758 || INTEGERP (ok_if_already_exists))
2759 barf_or_query_if_file_exists (encoded_newname, "make it a new name",
2760 INTEGERP (ok_if_already_exists), 0, 0);
2761
2762 unlink (SDATA (newname));
2763 if (0 > link (SDATA (encoded_file), SDATA (encoded_newname)))
2764 {
2765 #ifdef NO_ARG_ARRAY
2766 args[0] = file;
2767 args[1] = newname;
2768 report_file_error ("Adding new name", Flist (2, args));
2769 #else
2770 report_file_error ("Adding new name", Flist (2, &file));
2771 #endif
2772 }
2773
2774 UNGCPRO;
2775 return Qnil;
2776 }
2777
2778 #ifdef S_IFLNK
2779 DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3,
2780 "FMake symbolic link to file: \nFMake symbolic link to file %s: \np",
2781 doc: /* Make a symbolic link to FILENAME, named LINKNAME. Both args strings.
2782 Signals a `file-already-exists' error if a file LINKNAME already exists
2783 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
2784 A number as third arg means request confirmation if LINKNAME already exists.
2785 This happens for interactive use with M-x. */)
2786 (filename, linkname, ok_if_already_exists)
2787 Lisp_Object filename, linkname, ok_if_already_exists;
2788 {
2789 #ifdef NO_ARG_ARRAY
2790 Lisp_Object args[2];
2791 #endif
2792 Lisp_Object handler;
2793 Lisp_Object encoded_filename, encoded_linkname;
2794 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2795
2796 GCPRO4 (filename, linkname, encoded_filename, encoded_linkname);
2797 encoded_filename = encoded_linkname = Qnil;
2798 CHECK_STRING (filename);
2799 CHECK_STRING (linkname);
2800 /* If the link target has a ~, we must expand it to get
2801 a truly valid file name. Otherwise, do not expand;
2802 we want to permit links to relative file names. */
2803 if (SREF (filename, 0) == '~')
2804 filename = Fexpand_file_name (filename, Qnil);
2805 linkname = Fexpand_file_name (linkname, Qnil);
2806
2807 /* If the file name has special constructs in it,
2808 call the corresponding file handler. */
2809 handler = Ffind_file_name_handler (filename, Qmake_symbolic_link);
2810 if (!NILP (handler))
2811 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2812 linkname, ok_if_already_exists));
2813
2814 /* If the new link name has special constructs in it,
2815 call the corresponding file handler. */
2816 handler = Ffind_file_name_handler (linkname, Qmake_symbolic_link);
2817 if (!NILP (handler))
2818 RETURN_UNGCPRO (call4 (handler, Qmake_symbolic_link, filename,
2819 linkname, ok_if_already_exists));
2820
2821 encoded_filename = ENCODE_FILE (filename);
2822 encoded_linkname = ENCODE_FILE (linkname);
2823
2824 if (NILP (ok_if_already_exists)
2825 || INTEGERP (ok_if_already_exists))
2826 barf_or_query_if_file_exists (encoded_linkname, "make it a link",
2827 INTEGERP (ok_if_already_exists), 0, 0);
2828 if (0 > symlink (SDATA (encoded_filename),
2829 SDATA (encoded_linkname)))
2830 {
2831 /* If we didn't complain already, silently delete existing file. */
2832 if (errno == EEXIST)
2833 {
2834 unlink (SDATA (encoded_linkname));
2835 if (0 <= symlink (SDATA (encoded_filename),
2836 SDATA (encoded_linkname)))
2837 {
2838 UNGCPRO;
2839 return Qnil;
2840 }
2841 }
2842
2843 #ifdef NO_ARG_ARRAY
2844 args[0] = filename;
2845 args[1] = linkname;
2846 report_file_error ("Making symbolic link", Flist (2, args));
2847 #else
2848 report_file_error ("Making symbolic link", Flist (2, &filename));
2849 #endif
2850 }
2851 UNGCPRO;
2852 return Qnil;
2853 }
2854 #endif /* S_IFLNK */
2855
2856 #ifdef VMS
2857
2858 DEFUN ("define-logical-name", Fdefine_logical_name, Sdefine_logical_name,
2859 2, 2, "sDefine logical name: \nsDefine logical name %s as: ",
2860 doc: /* Define the job-wide logical name NAME to have the value STRING.
2861 If STRING is nil or a null string, the logical name NAME is deleted. */)
2862 (name, string)
2863 Lisp_Object name;
2864 Lisp_Object string;
2865 {
2866 CHECK_STRING (name);
2867 if (NILP (string))
2868 delete_logical_name (SDATA (name));
2869 else
2870 {
2871 CHECK_STRING (string);
2872
2873 if (SCHARS (string) == 0)
2874 delete_logical_name (SDATA (name));
2875 else
2876 define_logical_name (SDATA (name), SDATA (string));
2877 }
2878
2879 return string;
2880 }
2881 #endif /* VMS */
2882
2883 #ifdef HPUX_NET
2884
2885 DEFUN ("sysnetunam", Fsysnetunam, Ssysnetunam, 2, 2, 0,
2886 doc: /* Open a network connection to PATH using LOGIN as the login string. */)
2887 (path, login)
2888 Lisp_Object path, login;
2889 {
2890 int netresult;
2891
2892 CHECK_STRING (path);
2893 CHECK_STRING (login);
2894
2895 netresult = netunam (SDATA (path), SDATA (login));
2896
2897 if (netresult == -1)
2898 return Qnil;
2899 else
2900 return Qt;
2901 }
2902 #endif /* HPUX_NET */
2903 \f
2904 DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
2905 1, 1, 0,
2906 doc: /* Return t if file FILENAME specifies an absolute file name.
2907 On Unix, this is a name starting with a `/' or a `~'. */)
2908 (filename)
2909 Lisp_Object filename;
2910 {
2911 const unsigned char *ptr;
2912
2913 CHECK_STRING (filename);
2914 ptr = SDATA (filename);
2915 if (IS_DIRECTORY_SEP (*ptr) || *ptr == '~'
2916 #ifdef VMS
2917 /* ??? This criterion is probably wrong for '<'. */
2918 || index (ptr, ':') || index (ptr, '<')
2919 || (*ptr == '[' && (ptr[1] != '-' || (ptr[2] != '.' && ptr[2] != ']'))
2920 && ptr[1] != '.')
2921 #endif /* VMS */
2922 #ifdef DOS_NT
2923 || (IS_DRIVE (*ptr) && ptr[1] == ':' && IS_DIRECTORY_SEP (ptr[2]))
2924 #endif
2925 )
2926 return Qt;
2927 else
2928 return Qnil;
2929 }
2930 \f
2931 /* Return nonzero if file FILENAME exists and can be executed. */
2932
2933 static int
2934 check_executable (filename)
2935 char *filename;
2936 {
2937 #ifdef DOS_NT
2938 int len = strlen (filename);
2939 char *suffix;
2940 struct stat st;
2941 if (stat (filename, &st) < 0)
2942 return 0;
2943 #if defined (WINDOWSNT) || (defined (MSDOS) && __DJGPP__ > 1)
2944 return ((st.st_mode & S_IEXEC) != 0);
2945 #else
2946 return (S_ISREG (st.st_mode)
2947 && len >= 5
2948 && (stricmp ((suffix = filename + len-4), ".com") == 0
2949 || stricmp (suffix, ".exe") == 0
2950 || stricmp (suffix, ".bat") == 0)
2951 || (st.st_mode & S_IFMT) == S_IFDIR);
2952 #endif /* not WINDOWSNT */
2953 #else /* not DOS_NT */
2954 #ifdef HAVE_EUIDACCESS
2955 return (euidaccess (filename, 1) >= 0);
2956 #else
2957 /* Access isn't quite right because it uses the real uid
2958 and we really want to test with the effective uid.
2959 But Unix doesn't give us a right way to do it. */
2960 return (access (filename, 1) >= 0);
2961 #endif
2962 #endif /* not DOS_NT */
2963 }
2964
2965 /* Return nonzero if file FILENAME exists and can be written. */
2966
2967 static int
2968 check_writable (filename)
2969 char *filename;
2970 {
2971 #ifdef MSDOS
2972 struct stat st;
2973 if (stat (filename, &st) < 0)
2974 return 0;
2975 return (st.st_mode & S_IWRITE || (st.st_mode & S_IFMT) == S_IFDIR);
2976 #else /* not MSDOS */
2977 #ifdef HAVE_EUIDACCESS
2978 return (euidaccess (filename, 2) >= 0);
2979 #else
2980 /* Access isn't quite right because it uses the real uid
2981 and we really want to test with the effective uid.
2982 But Unix doesn't give us a right way to do it.
2983 Opening with O_WRONLY could work for an ordinary file,
2984 but would lose for directories. */
2985 return (access (filename, 2) >= 0);
2986 #endif
2987 #endif /* not MSDOS */
2988 }
2989
2990 DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
2991 doc: /* Return t if file FILENAME exists. (This does not mean you can read it.)
2992 See also `file-readable-p' and `file-attributes'. */)
2993 (filename)
2994 Lisp_Object filename;
2995 {
2996 Lisp_Object absname;
2997 Lisp_Object handler;
2998 struct stat statbuf;
2999
3000 CHECK_STRING (filename);
3001 absname = Fexpand_file_name (filename, Qnil);
3002
3003 /* If the file name has special constructs in it,
3004 call the corresponding file handler. */
3005 handler = Ffind_file_name_handler (absname, Qfile_exists_p);
3006 if (!NILP (handler))
3007 return call2 (handler, Qfile_exists_p, absname);
3008
3009 absname = ENCODE_FILE (absname);
3010
3011 return (stat (SDATA (absname), &statbuf) >= 0) ? Qt : Qnil;
3012 }
3013
3014 DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0,
3015 doc: /* Return t if FILENAME can be executed by you.
3016 For a directory, this means you can access files in that directory. */)
3017 (filename)
3018 Lisp_Object filename;
3019 {
3020 Lisp_Object absname;
3021 Lisp_Object handler;
3022
3023 CHECK_STRING (filename);
3024 absname = Fexpand_file_name (filename, Qnil);
3025
3026 /* If the file name has special constructs in it,
3027 call the corresponding file handler. */
3028 handler = Ffind_file_name_handler (absname, Qfile_executable_p);
3029 if (!NILP (handler))
3030 return call2 (handler, Qfile_executable_p, absname);
3031
3032 absname = ENCODE_FILE (absname);
3033
3034 return (check_executable (SDATA (absname)) ? Qt : Qnil);
3035 }
3036
3037 DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0,
3038 doc: /* Return t if file FILENAME exists and you can read it.
3039 See also `file-exists-p' and `file-attributes'. */)
3040 (filename)
3041 Lisp_Object filename;
3042 {
3043 Lisp_Object absname;
3044 Lisp_Object handler;
3045 int desc;
3046 int flags;
3047 struct stat statbuf;
3048
3049 CHECK_STRING (filename);
3050 absname = Fexpand_file_name (filename, Qnil);
3051
3052 /* If the file name has special constructs in it,
3053 call the corresponding file handler. */
3054 handler = Ffind_file_name_handler (absname, Qfile_readable_p);
3055 if (!NILP (handler))
3056 return call2 (handler, Qfile_readable_p, absname);
3057
3058 absname = ENCODE_FILE (absname);
3059
3060 #if defined(DOS_NT) || defined(macintosh)
3061 /* Under MS-DOS, Windows, and Macintosh, open does not work for
3062 directories. */
3063 if (access (SDATA (absname), 0) == 0)
3064 return Qt;
3065 return Qnil;
3066 #else /* not DOS_NT and not macintosh */
3067 flags = O_RDONLY;
3068 #if defined (S_ISFIFO) && defined (O_NONBLOCK)
3069 /* Opening a fifo without O_NONBLOCK can wait.
3070 We don't want to wait. But we don't want to mess wth O_NONBLOCK
3071 except in the case of a fifo, on a system which handles it. */
3072 desc = stat (SDATA (absname), &statbuf);
3073 if (desc < 0)
3074 return Qnil;
3075 if (S_ISFIFO (statbuf.st_mode))
3076 flags |= O_NONBLOCK;
3077 #endif
3078 desc = emacs_open (SDATA (absname), flags, 0);
3079 if (desc < 0)
3080 return Qnil;
3081 emacs_close (desc);
3082 return Qt;
3083 #endif /* not DOS_NT and not macintosh */
3084 }
3085
3086 /* Having this before file-symlink-p mysteriously caused it to be forgotten
3087 on the RT/PC. */
3088 DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
3089 doc: /* Return t if file FILENAME can be written or created by you. */)
3090 (filename)
3091 Lisp_Object filename;
3092 {
3093 Lisp_Object absname, dir, encoded;
3094 Lisp_Object handler;
3095 struct stat statbuf;
3096
3097 CHECK_STRING (filename);
3098 absname = Fexpand_file_name (filename, Qnil);
3099
3100 /* If the file name has special constructs in it,
3101 call the corresponding file handler. */
3102 handler = Ffind_file_name_handler (absname, Qfile_writable_p);
3103 if (!NILP (handler))
3104 return call2 (handler, Qfile_writable_p, absname);
3105
3106 encoded = ENCODE_FILE (absname);
3107 if (stat (SDATA (encoded), &statbuf) >= 0)
3108 return (check_writable (SDATA (encoded))
3109 ? Qt : Qnil);
3110
3111 dir = Ffile_name_directory (absname);
3112 #ifdef VMS
3113 if (!NILP (dir))
3114 dir = Fdirectory_file_name (dir);
3115 #endif /* VMS */
3116 #ifdef MSDOS
3117 if (!NILP (dir))
3118 dir = Fdirectory_file_name (dir);
3119 #endif /* MSDOS */
3120
3121 dir = ENCODE_FILE (dir);
3122 #ifdef WINDOWSNT
3123 /* The read-only attribute of the parent directory doesn't affect
3124 whether a file or directory can be created within it. Some day we
3125 should check ACLs though, which do affect this. */
3126 if (stat (SDATA (dir), &statbuf) < 0)
3127 return Qnil;
3128 return (statbuf.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
3129 #else
3130 return (check_writable (!NILP (dir) ? (char *) SDATA (dir) : "")
3131 ? Qt : Qnil);
3132 #endif
3133 }
3134 \f
3135 DEFUN ("access-file", Faccess_file, Saccess_file, 2, 2, 0,
3136 doc: /* Access file FILENAME, and get an error if that does not work.
3137 The second argument STRING is used in the error message.
3138 If there is no error, we return nil. */)
3139 (filename, string)
3140 Lisp_Object filename, string;
3141 {
3142 Lisp_Object handler, encoded_filename, absname;
3143 int fd;
3144
3145 CHECK_STRING (filename);
3146 absname = Fexpand_file_name (filename, Qnil);
3147
3148 CHECK_STRING (string);
3149
3150 /* If the file name has special constructs in it,
3151 call the corresponding file handler. */
3152 handler = Ffind_file_name_handler (absname, Qaccess_file);
3153 if (!NILP (handler))
3154 return call3 (handler, Qaccess_file, absname, string);
3155
3156 encoded_filename = ENCODE_FILE (absname);
3157
3158 fd = emacs_open (SDATA (encoded_filename), O_RDONLY, 0);
3159 if (fd < 0)
3160 report_file_error (SDATA (string), Fcons (filename, Qnil));
3161 emacs_close (fd);
3162
3163 return Qnil;
3164 }
3165 \f
3166 DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0,
3167 doc: /* Return non-nil if file FILENAME is the name of a symbolic link.
3168 The value is the name of the file to which it is linked.
3169 Otherwise returns nil. */)
3170 (filename)
3171 Lisp_Object filename;
3172 {
3173 #ifdef S_IFLNK
3174 char *buf;
3175 int bufsize;
3176 int valsize;
3177 Lisp_Object val;
3178 Lisp_Object handler;
3179
3180 CHECK_STRING (filename);
3181 filename = Fexpand_file_name (filename, Qnil);
3182
3183 /* If the file name has special constructs in it,
3184 call the corresponding file handler. */
3185 handler = Ffind_file_name_handler (filename, Qfile_symlink_p);
3186 if (!NILP (handler))
3187 return call2 (handler, Qfile_symlink_p, filename);
3188
3189 filename = ENCODE_FILE (filename);
3190
3191 bufsize = 50;
3192 buf = NULL;
3193 do
3194 {
3195 bufsize *= 2;
3196 buf = (char *) xrealloc (buf, bufsize);
3197 bzero (buf, bufsize);
3198
3199 errno = 0;
3200 valsize = readlink (SDATA (filename), buf, bufsize);
3201 if (valsize == -1)
3202 {
3203 #ifdef ERANGE
3204 /* HP-UX reports ERANGE if buffer is too small. */
3205 if (errno == ERANGE)
3206 valsize = bufsize;
3207 else
3208 #endif
3209 {
3210 xfree (buf);
3211 return Qnil;
3212 }
3213 }
3214 }
3215 while (valsize >= bufsize);
3216
3217 val = make_string (buf, valsize);
3218 if (buf[0] == '/' && index (buf, ':'))
3219 val = concat2 (build_string ("/:"), val);
3220 xfree (buf);
3221 val = DECODE_FILE (val);
3222 return val;
3223 #else /* not S_IFLNK */
3224 return Qnil;
3225 #endif /* not S_IFLNK */
3226 }
3227
3228 DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0,
3229 doc: /* Return t if FILENAME names an existing directory.
3230 Symbolic links to directories count as directories.
3231 See `file-symlink-p' to distinguish symlinks. */)
3232 (filename)
3233 Lisp_Object filename;
3234 {
3235 register Lisp_Object absname;
3236 struct stat st;
3237 Lisp_Object handler;
3238
3239 absname = expand_and_dir_to_file (filename, current_buffer->directory);
3240
3241 /* If the file name has special constructs in it,
3242 call the corresponding file handler. */
3243 handler = Ffind_file_name_handler (absname, Qfile_directory_p);
3244 if (!NILP (handler))
3245 return call2 (handler, Qfile_directory_p, absname);
3246
3247 absname = ENCODE_FILE (absname);
3248
3249 if (stat (SDATA (absname), &st) < 0)
3250 return Qnil;
3251 return (st.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
3252 }
3253
3254 DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p, Sfile_accessible_directory_p, 1, 1, 0,
3255 doc: /* Return t if file FILENAME names a directory you can open.
3256 For the value to be t, FILENAME must specify the name of a directory as a file,
3257 and the directory must allow you to open files in it. In order to use a
3258 directory as a buffer's current directory, this predicate must return true.
3259 A directory name spec may be given instead; then the value is t
3260 if the directory so specified exists and really is a readable and
3261 searchable directory. */)
3262 (filename)
3263 Lisp_Object filename;
3264 {
3265 Lisp_Object handler;
3266 int tem;
3267 struct gcpro gcpro1;
3268
3269 /* If the file name has special constructs in it,
3270 call the corresponding file handler. */
3271 handler = Ffind_file_name_handler (filename, Qfile_accessible_directory_p);
3272 if (!NILP (handler))
3273 return call2 (handler, Qfile_accessible_directory_p, filename);
3274
3275 /* It's an unlikely combination, but yes we really do need to gcpro:
3276 Suppose that file-accessible-directory-p has no handler, but
3277 file-directory-p does have a handler; this handler causes a GC which
3278 relocates the string in `filename'; and finally file-directory-p
3279 returns non-nil. Then we would end up passing a garbaged string
3280 to file-executable-p. */
3281 GCPRO1 (filename);
3282 tem = (NILP (Ffile_directory_p (filename))
3283 || NILP (Ffile_executable_p (filename)));
3284 UNGCPRO;
3285 return tem ? Qnil : Qt;
3286 }
3287
3288 DEFUN ("file-regular-p", Ffile_regular_p, Sfile_regular_p, 1, 1, 0,
3289 doc: /* Return t if file FILENAME is the name of a regular file.
3290 This is the sort of file that holds an ordinary stream of data bytes. */)
3291 (filename)
3292 Lisp_Object filename;
3293 {
3294 register Lisp_Object absname;
3295 struct stat st;
3296 Lisp_Object handler;
3297
3298 absname = expand_and_dir_to_file (filename, current_buffer->directory);
3299
3300 /* If the file name has special constructs in it,
3301 call the corresponding file handler. */
3302 handler = Ffind_file_name_handler (absname, Qfile_regular_p);
3303 if (!NILP (handler))
3304 return call2 (handler, Qfile_regular_p, absname);
3305
3306 absname = ENCODE_FILE (absname);
3307
3308 #ifdef WINDOWSNT
3309 {
3310 int result;
3311 Lisp_Object tem = Vw32_get_true_file_attributes;
3312
3313 /* Tell stat to use expensive method to get accurate info. */
3314 Vw32_get_true_file_attributes = Qt;
3315 result = stat (SDATA (absname), &st);
3316 Vw32_get_true_file_attributes = tem;
3317
3318 if (result < 0)
3319 return Qnil;
3320 return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
3321 }
3322 #else
3323 if (stat (SDATA (absname), &st) < 0)
3324 return Qnil;
3325 return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
3326 #endif
3327 }
3328 \f
3329 DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
3330 doc: /* Return mode bits of file named FILENAME, as an integer. */)
3331 (filename)
3332 Lisp_Object filename;
3333 {
3334 Lisp_Object absname;
3335 struct stat st;
3336 Lisp_Object handler;
3337
3338 absname = expand_and_dir_to_file (filename, current_buffer->directory);
3339
3340 /* If the file name has special constructs in it,
3341 call the corresponding file handler. */
3342 handler = Ffind_file_name_handler (absname, Qfile_modes);
3343 if (!NILP (handler))
3344 return call2 (handler, Qfile_modes, absname);
3345
3346 absname = ENCODE_FILE (absname);
3347
3348 if (stat (SDATA (absname), &st) < 0)
3349 return Qnil;
3350 #if defined (MSDOS) && __DJGPP__ < 2
3351 if (check_executable (SDATA (absname)))
3352 st.st_mode |= S_IEXEC;
3353 #endif /* MSDOS && __DJGPP__ < 2 */
3354
3355 return make_number (st.st_mode & 07777);
3356 }
3357
3358 DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0,
3359 doc: /* Set mode bits of file named FILENAME to MODE (an integer).
3360 Only the 12 low bits of MODE are used. */)
3361 (filename, mode)
3362 Lisp_Object filename, mode;
3363 {
3364 Lisp_Object absname, encoded_absname;
3365 Lisp_Object handler;
3366
3367 absname = Fexpand_file_name (filename, current_buffer->directory);
3368 CHECK_NUMBER (mode);
3369
3370 /* If the file name has special constructs in it,
3371 call the corresponding file handler. */
3372 handler = Ffind_file_name_handler (absname, Qset_file_modes);
3373 if (!NILP (handler))
3374 return call3 (handler, Qset_file_modes, absname, mode);
3375
3376 encoded_absname = ENCODE_FILE (absname);
3377
3378 if (chmod (SDATA (encoded_absname), XINT (mode)) < 0)
3379 report_file_error ("Doing chmod", Fcons (absname, Qnil));
3380
3381 return Qnil;
3382 }
3383
3384 DEFUN ("set-default-file-modes", Fset_default_file_modes, Sset_default_file_modes, 1, 1, 0,
3385 doc: /* Set the file permission bits for newly created files.
3386 The argument MODE should be an integer; only the low 9 bits are used.
3387 This setting is inherited by subprocesses. */)
3388 (mode)
3389 Lisp_Object mode;
3390 {
3391 CHECK_NUMBER (mode);
3392
3393 umask ((~ XINT (mode)) & 0777);
3394
3395 return Qnil;
3396 }
3397
3398 DEFUN ("default-file-modes", Fdefault_file_modes, Sdefault_file_modes, 0, 0, 0,
3399 doc: /* Return the default file protection for created files.
3400 The value is an integer. */)
3401 ()
3402 {
3403 int realmask;
3404 Lisp_Object value;
3405
3406 realmask = umask (0);
3407 umask (realmask);
3408
3409 XSETINT (value, (~ realmask) & 0777);
3410 return value;
3411 }
3412
3413 \f
3414 #ifdef __NetBSD__
3415 #define unix 42
3416 #endif
3417
3418 #ifdef unix
3419 DEFUN ("unix-sync", Funix_sync, Sunix_sync, 0, 0, "",
3420 doc: /* Tell Unix to finish all pending disk updates. */)
3421 ()
3422 {
3423 sync ();
3424 return Qnil;
3425 }
3426
3427 #endif /* unix */
3428
3429 DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_p, 2, 2, 0,
3430 doc: /* Return t if file FILE1 is newer than file FILE2.
3431 If FILE1 does not exist, the answer is nil;
3432 otherwise, if FILE2 does not exist, the answer is t. */)
3433 (file1, file2)
3434 Lisp_Object file1, file2;
3435 {
3436 Lisp_Object absname1, absname2;
3437 struct stat st;
3438 int mtime1;
3439 Lisp_Object handler;
3440 struct gcpro gcpro1, gcpro2;
3441
3442 CHECK_STRING (file1);
3443 CHECK_STRING (file2);
3444
3445 absname1 = Qnil;
3446 GCPRO2 (absname1, file2);
3447 absname1 = expand_and_dir_to_file (file1, current_buffer->directory);
3448 absname2 = expand_and_dir_to_file (file2, current_buffer->directory);
3449 UNGCPRO;
3450
3451 /* If the file name has special constructs in it,
3452 call the corresponding file handler. */
3453 handler = Ffind_file_name_handler (absname1, Qfile_newer_than_file_p);
3454 if (NILP (handler))
3455 handler = Ffind_file_name_handler (absname2, Qfile_newer_than_file_p);
3456 if (!NILP (handler))
3457 return call3 (handler, Qfile_newer_than_file_p, absname1, absname2);
3458
3459 GCPRO2 (absname1, absname2);
3460 absname1 = ENCODE_FILE (absname1);
3461 absname2 = ENCODE_FILE (absname2);
3462 UNGCPRO;
3463
3464 if (stat (SDATA (absname1), &st) < 0)
3465 return Qnil;
3466
3467 mtime1 = st.st_mtime;
3468
3469 if (stat (SDATA (absname2), &st) < 0)
3470 return Qt;
3471
3472 return (mtime1 > st.st_mtime) ? Qt : Qnil;
3473 }
3474 \f
3475 #ifdef DOS_NT
3476 Lisp_Object Qfind_buffer_file_type;
3477 #endif /* DOS_NT */
3478
3479 #ifndef READ_BUF_SIZE
3480 #define READ_BUF_SIZE (64 << 10)
3481 #endif
3482
3483 extern void adjust_markers_for_delete P_ ((int, int, int, int));
3484
3485 /* This function is called after Lisp functions to decide a coding
3486 system are called, or when they cause an error. Before they are
3487 called, the current buffer is set unibyte and it contains only a
3488 newly inserted text (thus the buffer was empty before the
3489 insertion).
3490
3491 The functions may set markers, overlays, text properties, or even
3492 alter the buffer contents, change the current buffer.
3493
3494 Here, we reset all those changes by:
3495 o set back the current buffer.
3496 o move all markers and overlays to BEG.
3497 o remove all text properties.
3498 o set back the buffer multibyteness. */
3499
3500 static Lisp_Object
3501 decide_coding_unwind (unwind_data)
3502 Lisp_Object unwind_data;
3503 {
3504 Lisp_Object multibyte, undo_list, buffer;
3505
3506 multibyte = XCAR (unwind_data);
3507 unwind_data = XCDR (unwind_data);
3508 undo_list = XCAR (unwind_data);
3509 buffer = XCDR (unwind_data);
3510
3511 if (current_buffer != XBUFFER (buffer))
3512 set_buffer_internal (XBUFFER (buffer));
3513 adjust_markers_for_delete (BEG, BEG_BYTE, Z, Z_BYTE);
3514 adjust_overlays_for_delete (BEG, Z - BEG);
3515 BUF_INTERVALS (current_buffer) = 0;
3516 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3517
3518 /* Now we are safe to change the buffer's multibyteness directly. */
3519 current_buffer->enable_multibyte_characters = multibyte;
3520 current_buffer->undo_list = undo_list;
3521
3522 return Qnil;
3523 }
3524
3525
3526 /* Used to pass values from insert-file-contents to read_non_regular. */
3527
3528 static int non_regular_fd;
3529 static int non_regular_inserted;
3530 static int non_regular_nbytes;
3531
3532
3533 /* Read from a non-regular file.
3534 Read non_regular_trytry bytes max from non_regular_fd.
3535 Non_regular_inserted specifies where to put the read bytes.
3536 Value is the number of bytes read. */
3537
3538 static Lisp_Object
3539 read_non_regular ()
3540 {
3541 int nbytes;
3542
3543 immediate_quit = 1;
3544 QUIT;
3545 nbytes = emacs_read (non_regular_fd,
3546 BEG_ADDR + PT_BYTE - BEG_BYTE + non_regular_inserted,
3547 non_regular_nbytes);
3548 immediate_quit = 0;
3549 return make_number (nbytes);
3550 }
3551
3552
3553 /* Condition-case handler used when reading from non-regular files
3554 in insert-file-contents. */
3555
3556 static Lisp_Object
3557 read_non_regular_quit ()
3558 {
3559 return Qnil;
3560 }
3561
3562
3563 DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents,
3564 1, 5, 0,
3565 doc: /* Insert contents of file FILENAME after point.
3566 Returns list of absolute file name and number of bytes inserted.
3567 If second argument VISIT is non-nil, the buffer's visited filename
3568 and last save file modtime are set, and it is marked unmodified.
3569 If visiting and the file does not exist, visiting is completed
3570 before the error is signaled.
3571 The optional third and fourth arguments BEG and END
3572 specify what portion of the file to insert.
3573 These arguments count bytes in the file, not characters in the buffer.
3574 If VISIT is non-nil, BEG and END must be nil.
3575
3576 If optional fifth argument REPLACE is non-nil,
3577 it means replace the current buffer contents (in the accessible portion)
3578 with the file contents. This is better than simply deleting and inserting
3579 the whole thing because (1) it preserves some marker positions
3580 and (2) it puts less data in the undo list.
3581 When REPLACE is non-nil, the value is the number of characters actually read,
3582 which is often less than the number of characters to be read.
3583
3584 This does code conversion according to the value of
3585 `coding-system-for-read' or `file-coding-system-alist',
3586 and sets the variable `last-coding-system-used' to the coding system
3587 actually used. */)
3588 (filename, visit, beg, end, replace)
3589 Lisp_Object filename, visit, beg, end, replace;
3590 {
3591 struct stat st;
3592 register int fd;
3593 int inserted = 0;
3594 register int how_much;
3595 register int unprocessed;
3596 int count = SPECPDL_INDEX ();
3597 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3598 Lisp_Object handler, val, insval, orig_filename;
3599 Lisp_Object p;
3600 int total = 0;
3601 int not_regular = 0;
3602 unsigned char read_buf[READ_BUF_SIZE];
3603 struct coding_system coding;
3604 unsigned char buffer[1 << 14];
3605 int replace_handled = 0;
3606 int set_coding_system = 0;
3607 int coding_system_decided = 0;
3608 int read_quit = 0;
3609
3610 if (current_buffer->base_buffer && ! NILP (visit))
3611 error ("Cannot do file visiting in an indirect buffer");
3612
3613 if (!NILP (current_buffer->read_only))
3614 Fbarf_if_buffer_read_only ();
3615
3616 val = Qnil;
3617 p = Qnil;
3618 orig_filename = Qnil;
3619
3620 GCPRO4 (filename, val, p, orig_filename);
3621
3622 CHECK_STRING (filename);
3623 filename = Fexpand_file_name (filename, Qnil);
3624
3625 /* If the file name has special constructs in it,
3626 call the corresponding file handler. */
3627 handler = Ffind_file_name_handler (filename, Qinsert_file_contents);
3628 if (!NILP (handler))
3629 {
3630 val = call6 (handler, Qinsert_file_contents, filename,
3631 visit, beg, end, replace);
3632 if (CONSP (val) && CONSP (XCDR (val)))
3633 inserted = XINT (XCAR (XCDR (val)));
3634 goto handled;
3635 }
3636
3637 orig_filename = filename;
3638 filename = ENCODE_FILE (filename);
3639
3640 fd = -1;
3641
3642 #ifdef WINDOWSNT
3643 {
3644 Lisp_Object tem = Vw32_get_true_file_attributes;
3645
3646 /* Tell stat to use expensive method to get accurate info. */
3647 Vw32_get_true_file_attributes = Qt;
3648 total = stat (SDATA (filename), &st);
3649 Vw32_get_true_file_attributes = tem;
3650 }
3651 if (total < 0)
3652 #else
3653 #ifndef APOLLO
3654 if (stat (SDATA (filename), &st) < 0)
3655 #else
3656 if ((fd = emacs_open (SDATA (filename), O_RDONLY, 0)) < 0
3657 || fstat (fd, &st) < 0)
3658 #endif /* not APOLLO */
3659 #endif /* WINDOWSNT */
3660 {
3661 if (fd >= 0) emacs_close (fd);
3662 badopen:
3663 if (NILP (visit))
3664 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
3665 st.st_mtime = -1;
3666 how_much = 0;
3667 if (!NILP (Vcoding_system_for_read))
3668 Fset (Qbuffer_file_coding_system, Vcoding_system_for_read);
3669 goto notfound;
3670 }
3671
3672 #ifdef S_IFREG
3673 /* This code will need to be changed in order to work on named
3674 pipes, and it's probably just not worth it. So we should at
3675 least signal an error. */
3676 if (!S_ISREG (st.st_mode))
3677 {
3678 not_regular = 1;
3679
3680 if (! NILP (visit))
3681 goto notfound;
3682
3683 if (! NILP (replace) || ! NILP (beg) || ! NILP (end))
3684 Fsignal (Qfile_error,
3685 Fcons (build_string ("not a regular file"),
3686 Fcons (orig_filename, Qnil)));
3687 }
3688 #endif
3689
3690 if (fd < 0)
3691 if ((fd = emacs_open (SDATA (filename), O_RDONLY, 0)) < 0)
3692 goto badopen;
3693
3694 /* Replacement should preserve point as it preserves markers. */
3695 if (!NILP (replace))
3696 record_unwind_protect (restore_point_unwind, Fpoint_marker ());
3697
3698 record_unwind_protect (close_file_unwind, make_number (fd));
3699
3700 /* Supposedly happens on VMS. */
3701 if (! not_regular && st.st_size < 0)
3702 error ("File size is negative");
3703
3704 /* Prevent redisplay optimizations. */
3705 current_buffer->clip_changed = 1;
3706
3707 if (!NILP (visit))
3708 {
3709 if (!NILP (beg) || !NILP (end))
3710 error ("Attempt to visit less than an entire file");
3711 if (BEG < Z && NILP (replace))
3712 error ("Cannot do file visiting in a non-empty buffer");
3713 }
3714
3715 if (!NILP (beg))
3716 CHECK_NUMBER (beg);
3717 else
3718 XSETFASTINT (beg, 0);
3719
3720 if (!NILP (end))
3721 CHECK_NUMBER (end);
3722 else
3723 {
3724 if (! not_regular)
3725 {
3726 XSETINT (end, st.st_size);
3727
3728 /* Arithmetic overflow can occur if an Emacs integer cannot
3729 represent the file size, or if the calculations below
3730 overflow. The calculations below double the file size
3731 twice, so check that it can be multiplied by 4 safely. */
3732 if (XINT (end) != st.st_size
3733 || ((int) st.st_size * 4) / 4 != st.st_size)
3734 error ("Maximum buffer size exceeded");
3735
3736 /* The file size returned from stat may be zero, but data
3737 may be readable nonetheless, for example when this is a
3738 file in the /proc filesystem. */
3739 if (st.st_size == 0)
3740 XSETINT (end, READ_BUF_SIZE);
3741 }
3742 }
3743
3744 if (BEG < Z)
3745 {
3746 /* Decide the coding system to use for reading the file now
3747 because we can't use an optimized method for handling
3748 `coding:' tag if the current buffer is not empty. */
3749 Lisp_Object val;
3750 val = Qnil;
3751
3752 if (!NILP (Vcoding_system_for_read))
3753 val = Vcoding_system_for_read;
3754 else if (! NILP (replace))
3755 /* In REPLACE mode, we can use the same coding system
3756 that was used to visit the file. */
3757 val = current_buffer->buffer_file_coding_system;
3758 else
3759 {
3760 /* Don't try looking inside a file for a coding system
3761 specification if it is not seekable. */
3762 if (! not_regular && ! NILP (Vset_auto_coding_function))
3763 {
3764 /* Find a coding system specified in the heading two
3765 lines or in the tailing several lines of the file.
3766 We assume that the 1K-byte and 3K-byte for heading
3767 and tailing respectively are sufficient for this
3768 purpose. */
3769 int nread;
3770
3771 if (st.st_size <= (1024 * 4))
3772 nread = emacs_read (fd, read_buf, 1024 * 4);
3773 else
3774 {
3775 nread = emacs_read (fd, read_buf, 1024);
3776 if (nread >= 0)
3777 {
3778 if (lseek (fd, st.st_size - (1024 * 3), 0) < 0)
3779 report_file_error ("Setting file position",
3780 Fcons (orig_filename, Qnil));
3781 nread += emacs_read (fd, read_buf + nread, 1024 * 3);
3782 }
3783 }
3784
3785 if (nread < 0)
3786 error ("IO error reading %s: %s",
3787 SDATA (orig_filename), emacs_strerror (errno));
3788 else if (nread > 0)
3789 {
3790 struct buffer *prev = current_buffer;
3791 Lisp_Object buffer;
3792 struct buffer *buf;
3793
3794 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3795
3796 buffer = Fget_buffer_create (build_string (" *code-converting-work*"));
3797 buf = XBUFFER (buffer);
3798
3799 buf->directory = current_buffer->directory;
3800 buf->read_only = Qnil;
3801 buf->filename = Qnil;
3802 buf->undo_list = Qt;
3803 buf->overlays_before = Qnil;
3804 buf->overlays_after = Qnil;
3805
3806 set_buffer_internal (buf);
3807 Ferase_buffer ();
3808 buf->enable_multibyte_characters = Qnil;
3809
3810 insert_1_both (read_buf, nread, nread, 0, 0, 0);
3811 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
3812 val = call2 (Vset_auto_coding_function,
3813 filename, make_number (nread));
3814 set_buffer_internal (prev);
3815
3816 /* Discard the unwind protect for recovering the
3817 current buffer. */
3818 specpdl_ptr--;
3819
3820 /* Rewind the file for the actual read done later. */
3821 if (lseek (fd, 0, 0) < 0)
3822 report_file_error ("Setting file position",
3823 Fcons (orig_filename, Qnil));
3824 }
3825 }
3826
3827 if (NILP (val))
3828 {
3829 /* If we have not yet decided a coding system, check
3830 file-coding-system-alist. */
3831 Lisp_Object args[6], coding_systems;
3832
3833 args[0] = Qinsert_file_contents, args[1] = orig_filename;
3834 args[2] = visit, args[3] = beg, args[4] = end, args[5] = replace;
3835 coding_systems = Ffind_operation_coding_system (6, args);
3836 if (CONSP (coding_systems))
3837 val = XCAR (coding_systems);
3838 }
3839 }
3840
3841 setup_coding_system (Fcheck_coding_system (val), &coding);
3842 /* Ensure we set Vlast_coding_system_used. */
3843 set_coding_system = 1;
3844
3845 if (NILP (current_buffer->enable_multibyte_characters)
3846 && ! NILP (val))
3847 /* We must suppress all character code conversion except for
3848 end-of-line conversion. */
3849 setup_raw_text_coding_system (&coding);
3850
3851 coding.src_multibyte = 0;
3852 coding.dst_multibyte
3853 = !NILP (current_buffer->enable_multibyte_characters);
3854 coding_system_decided = 1;
3855 }
3856
3857 /* If requested, replace the accessible part of the buffer
3858 with the file contents. Avoid replacing text at the
3859 beginning or end of the buffer that matches the file contents;
3860 that preserves markers pointing to the unchanged parts.
3861
3862 Here we implement this feature in an optimized way
3863 for the case where code conversion is NOT needed.
3864 The following if-statement handles the case of conversion
3865 in a less optimal way.
3866
3867 If the code conversion is "automatic" then we try using this
3868 method and hope for the best.
3869 But if we discover the need for conversion, we give up on this method
3870 and let the following if-statement handle the replace job. */
3871 if (!NILP (replace)
3872 && BEGV < ZV
3873 && !(coding.common_flags & CODING_REQUIRE_DECODING_MASK))
3874 {
3875 /* same_at_start and same_at_end count bytes,
3876 because file access counts bytes
3877 and BEG and END count bytes. */
3878 int same_at_start = BEGV_BYTE;
3879 int same_at_end = ZV_BYTE;
3880 int overlap;
3881 /* There is still a possibility we will find the need to do code
3882 conversion. If that happens, we set this variable to 1 to
3883 give up on handling REPLACE in the optimized way. */
3884 int giveup_match_end = 0;
3885
3886 if (XINT (beg) != 0)
3887 {
3888 if (lseek (fd, XINT (beg), 0) < 0)
3889 report_file_error ("Setting file position",
3890 Fcons (orig_filename, Qnil));
3891 }
3892
3893 immediate_quit = 1;
3894 QUIT;
3895 /* Count how many chars at the start of the file
3896 match the text at the beginning of the buffer. */
3897 while (1)
3898 {
3899 int nread, bufpos;
3900
3901 nread = emacs_read (fd, buffer, sizeof buffer);
3902 if (nread < 0)
3903 error ("IO error reading %s: %s",
3904 SDATA (orig_filename), emacs_strerror (errno));
3905 else if (nread == 0)
3906 break;
3907
3908 if (coding.type == coding_type_undecided)
3909 detect_coding (&coding, buffer, nread);
3910 if (coding.common_flags & CODING_REQUIRE_DECODING_MASK)
3911 /* We found that the file should be decoded somehow.
3912 Let's give up here. */
3913 {
3914 giveup_match_end = 1;
3915 break;
3916 }
3917
3918 if (coding.eol_type == CODING_EOL_UNDECIDED)
3919 detect_eol (&coding, buffer, nread);
3920 if (coding.eol_type != CODING_EOL_UNDECIDED
3921 && coding.eol_type != CODING_EOL_LF)
3922 /* We found that the format of eol should be decoded.
3923 Let's give up here. */
3924 {
3925 giveup_match_end = 1;
3926 break;
3927 }
3928
3929 bufpos = 0;
3930 while (bufpos < nread && same_at_start < ZV_BYTE
3931 && FETCH_BYTE (same_at_start) == buffer[bufpos])
3932 same_at_start++, bufpos++;
3933 /* If we found a discrepancy, stop the scan.
3934 Otherwise loop around and scan the next bufferful. */
3935 if (bufpos != nread)
3936 break;
3937 }
3938 immediate_quit = 0;
3939 /* If the file matches the buffer completely,
3940 there's no need to replace anything. */
3941 if (same_at_start - BEGV_BYTE == XINT (end))
3942 {
3943 emacs_close (fd);
3944 specpdl_ptr--;
3945 /* Truncate the buffer to the size of the file. */
3946 del_range_1 (same_at_start, same_at_end, 0, 0);
3947 goto handled;
3948 }
3949 immediate_quit = 1;
3950 QUIT;
3951 /* Count how many chars at the end of the file
3952 match the text at the end of the buffer. But, if we have
3953 already found that decoding is necessary, don't waste time. */
3954 while (!giveup_match_end)
3955 {
3956 int total_read, nread, bufpos, curpos, trial;
3957
3958 /* At what file position are we now scanning? */
3959 curpos = XINT (end) - (ZV_BYTE - same_at_end);
3960 /* If the entire file matches the buffer tail, stop the scan. */
3961 if (curpos == 0)
3962 break;
3963 /* How much can we scan in the next step? */
3964 trial = min (curpos, sizeof buffer);
3965 if (lseek (fd, curpos - trial, 0) < 0)
3966 report_file_error ("Setting file position",
3967 Fcons (orig_filename, Qnil));
3968
3969 total_read = nread = 0;
3970 while (total_read < trial)
3971 {
3972 nread = emacs_read (fd, buffer + total_read, trial - total_read);
3973 if (nread < 0)
3974 error ("IO error reading %s: %s",
3975 SDATA (orig_filename), emacs_strerror (errno));
3976 else if (nread == 0)
3977 break;
3978 total_read += nread;
3979 }
3980
3981 /* Scan this bufferful from the end, comparing with
3982 the Emacs buffer. */
3983 bufpos = total_read;
3984
3985 /* Compare with same_at_start to avoid counting some buffer text
3986 as matching both at the file's beginning and at the end. */
3987 while (bufpos > 0 && same_at_end > same_at_start
3988 && FETCH_BYTE (same_at_end - 1) == buffer[bufpos - 1])
3989 same_at_end--, bufpos--;
3990
3991 /* If we found a discrepancy, stop the scan.
3992 Otherwise loop around and scan the preceding bufferful. */
3993 if (bufpos != 0)
3994 {
3995 /* If this discrepancy is because of code conversion,
3996 we cannot use this method; giveup and try the other. */
3997 if (same_at_end > same_at_start
3998 && FETCH_BYTE (same_at_end - 1) >= 0200
3999 && ! NILP (current_buffer->enable_multibyte_characters)
4000 && (CODING_MAY_REQUIRE_DECODING (&coding)))
4001 giveup_match_end = 1;
4002 break;
4003 }
4004
4005 if (nread == 0)
4006 break;
4007 }
4008 immediate_quit = 0;
4009
4010 if (! giveup_match_end)
4011 {
4012 int temp;
4013
4014 /* We win! We can handle REPLACE the optimized way. */
4015
4016 /* Extend the start of non-matching text area to multibyte
4017 character boundary. */
4018 if (! NILP (current_buffer->enable_multibyte_characters))
4019 while (same_at_start > BEGV_BYTE
4020 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
4021 same_at_start--;
4022
4023 /* Extend the end of non-matching text area to multibyte
4024 character boundary. */
4025 if (! NILP (current_buffer->enable_multibyte_characters))
4026 while (same_at_end < ZV_BYTE
4027 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
4028 same_at_end++;
4029
4030 /* Don't try to reuse the same piece of text twice. */
4031 overlap = (same_at_start - BEGV_BYTE
4032 - (same_at_end + st.st_size - ZV));
4033 if (overlap > 0)
4034 same_at_end += overlap;
4035
4036 /* Arrange to read only the nonmatching middle part of the file. */
4037 XSETFASTINT (beg, XINT (beg) + (same_at_start - BEGV_BYTE));
4038 XSETFASTINT (end, XINT (end) - (ZV_BYTE - same_at_end));
4039
4040 del_range_byte (same_at_start, same_at_end, 0);
4041 /* Insert from the file at the proper position. */
4042 temp = BYTE_TO_CHAR (same_at_start);
4043 SET_PT_BOTH (temp, same_at_start);
4044
4045 /* If display currently starts at beginning of line,
4046 keep it that way. */
4047 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
4048 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
4049
4050 replace_handled = 1;
4051 }
4052 }
4053
4054 /* If requested, replace the accessible part of the buffer
4055 with the file contents. Avoid replacing text at the
4056 beginning or end of the buffer that matches the file contents;
4057 that preserves markers pointing to the unchanged parts.
4058
4059 Here we implement this feature for the case where code conversion
4060 is needed, in a simple way that needs a lot of memory.
4061 The preceding if-statement handles the case of no conversion
4062 in a more optimized way. */
4063 if (!NILP (replace) && ! replace_handled && BEGV < ZV)
4064 {
4065 int same_at_start = BEGV_BYTE;
4066 int same_at_end = ZV_BYTE;
4067 int overlap;
4068 int bufpos;
4069 /* Make sure that the gap is large enough. */
4070 int bufsize = 2 * st.st_size;
4071 unsigned char *conversion_buffer = (unsigned char *) xmalloc (bufsize);
4072 int temp;
4073
4074 /* First read the whole file, performing code conversion into
4075 CONVERSION_BUFFER. */
4076
4077 if (lseek (fd, XINT (beg), 0) < 0)
4078 {
4079 xfree (conversion_buffer);
4080 report_file_error ("Setting file position",
4081 Fcons (orig_filename, Qnil));
4082 }
4083
4084 total = st.st_size; /* Total bytes in the file. */
4085 how_much = 0; /* Bytes read from file so far. */
4086 inserted = 0; /* Bytes put into CONVERSION_BUFFER so far. */
4087 unprocessed = 0; /* Bytes not processed in previous loop. */
4088
4089 while (how_much < total)
4090 {
4091 /* try is reserved in some compilers (Microsoft C) */
4092 int trytry = min (total - how_much, READ_BUF_SIZE - unprocessed);
4093 unsigned char *destination = read_buf + unprocessed;
4094 int this;
4095
4096 /* Allow quitting out of the actual I/O. */
4097 immediate_quit = 1;
4098 QUIT;
4099 this = emacs_read (fd, destination, trytry);
4100 immediate_quit = 0;
4101
4102 if (this < 0 || this + unprocessed == 0)
4103 {
4104 how_much = this;
4105 break;
4106 }
4107
4108 how_much += this;
4109
4110 if (CODING_MAY_REQUIRE_DECODING (&coding))
4111 {
4112 int require, result;
4113
4114 this += unprocessed;
4115
4116 /* If we are using more space than estimated,
4117 make CONVERSION_BUFFER bigger. */
4118 require = decoding_buffer_size (&coding, this);
4119 if (inserted + require + 2 * (total - how_much) > bufsize)
4120 {
4121 bufsize = inserted + require + 2 * (total - how_much);
4122 conversion_buffer = (unsigned char *) xrealloc (conversion_buffer, bufsize);
4123 }
4124
4125 /* Convert this batch with results in CONVERSION_BUFFER. */
4126 if (how_much >= total) /* This is the last block. */
4127 coding.mode |= CODING_MODE_LAST_BLOCK;
4128 if (coding.composing != COMPOSITION_DISABLED)
4129 coding_allocate_composition_data (&coding, BEGV);
4130 result = decode_coding (&coding, read_buf,
4131 conversion_buffer + inserted,
4132 this, bufsize - inserted);
4133
4134 /* Save for next iteration whatever we didn't convert. */
4135 unprocessed = this - coding.consumed;
4136 bcopy (read_buf + coding.consumed, read_buf, unprocessed);
4137 if (!NILP (current_buffer->enable_multibyte_characters))
4138 this = coding.produced;
4139 else
4140 this = str_as_unibyte (conversion_buffer + inserted,
4141 coding.produced);
4142 }
4143
4144 inserted += this;
4145 }
4146
4147 /* At this point, INSERTED is how many characters (i.e. bytes)
4148 are present in CONVERSION_BUFFER.
4149 HOW_MUCH should equal TOTAL,
4150 or should be <= 0 if we couldn't read the file. */
4151
4152 if (how_much < 0)
4153 {
4154 xfree (conversion_buffer);
4155
4156 if (how_much == -1)
4157 error ("IO error reading %s: %s",
4158 SDATA (orig_filename), emacs_strerror (errno));
4159 else if (how_much == -2)
4160 error ("maximum buffer size exceeded");
4161 }
4162
4163 /* Compare the beginning of the converted file
4164 with the buffer text. */
4165
4166 bufpos = 0;
4167 while (bufpos < inserted && same_at_start < same_at_end
4168 && FETCH_BYTE (same_at_start) == conversion_buffer[bufpos])
4169 same_at_start++, bufpos++;
4170
4171 /* If the file matches the buffer completely,
4172 there's no need to replace anything. */
4173
4174 if (bufpos == inserted)
4175 {
4176 xfree (conversion_buffer);
4177 emacs_close (fd);
4178 specpdl_ptr--;
4179 /* Truncate the buffer to the size of the file. */
4180 del_range_byte (same_at_start, same_at_end, 0);
4181 inserted = 0;
4182 goto handled;
4183 }
4184
4185 /* Extend the start of non-matching text area to multibyte
4186 character boundary. */
4187 if (! NILP (current_buffer->enable_multibyte_characters))
4188 while (same_at_start > BEGV_BYTE
4189 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_start)))
4190 same_at_start--;
4191
4192 /* Scan this bufferful from the end, comparing with
4193 the Emacs buffer. */
4194 bufpos = inserted;
4195
4196 /* Compare with same_at_start to avoid counting some buffer text
4197 as matching both at the file's beginning and at the end. */
4198 while (bufpos > 0 && same_at_end > same_at_start
4199 && FETCH_BYTE (same_at_end - 1) == conversion_buffer[bufpos - 1])
4200 same_at_end--, bufpos--;
4201
4202 /* Extend the end of non-matching text area to multibyte
4203 character boundary. */
4204 if (! NILP (current_buffer->enable_multibyte_characters))
4205 while (same_at_end < ZV_BYTE
4206 && ! CHAR_HEAD_P (FETCH_BYTE (same_at_end)))
4207 same_at_end++;
4208
4209 /* Don't try to reuse the same piece of text twice. */
4210 overlap = same_at_start - BEGV_BYTE - (same_at_end + inserted - ZV_BYTE);
4211 if (overlap > 0)
4212 same_at_end += overlap;
4213
4214 /* If display currently starts at beginning of line,
4215 keep it that way. */
4216 if (XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
4217 XWINDOW (selected_window)->start_at_line_beg = Fbolp ();
4218
4219 /* Replace the chars that we need to replace,
4220 and update INSERTED to equal the number of bytes
4221 we are taking from the file. */
4222 inserted -= (Z_BYTE - same_at_end) + (same_at_start - BEG_BYTE);
4223
4224 if (same_at_end != same_at_start)
4225 {
4226 del_range_byte (same_at_start, same_at_end, 0);
4227 temp = GPT;
4228 same_at_start = GPT_BYTE;
4229 }
4230 else
4231 {
4232 temp = BYTE_TO_CHAR (same_at_start);
4233 }
4234 /* Insert from the file at the proper position. */
4235 SET_PT_BOTH (temp, same_at_start);
4236 insert_1 (conversion_buffer + same_at_start - BEG_BYTE, inserted,
4237 0, 0, 0);
4238 if (coding.cmp_data && coding.cmp_data->used)
4239 coding_restore_composition (&coding, Fcurrent_buffer ());
4240 coding_free_composition_data (&coding);
4241
4242 /* Set `inserted' to the number of inserted characters. */
4243 inserted = PT - temp;
4244
4245 xfree (conversion_buffer);
4246 emacs_close (fd);
4247 specpdl_ptr--;
4248
4249 goto handled;
4250 }
4251
4252 if (! not_regular)
4253 {
4254 register Lisp_Object temp;
4255
4256 total = XINT (end) - XINT (beg);
4257
4258 /* Make sure point-max won't overflow after this insertion. */
4259 XSETINT (temp, total);
4260 if (total != XINT (temp))
4261 error ("Maximum buffer size exceeded");
4262 }
4263 else
4264 /* For a special file, all we can do is guess. */
4265 total = READ_BUF_SIZE;
4266
4267 if (NILP (visit) && total > 0)
4268 prepare_to_modify_buffer (PT, PT, NULL);
4269
4270 move_gap (PT);
4271 if (GAP_SIZE < total)
4272 make_gap (total - GAP_SIZE);
4273
4274 if (XINT (beg) != 0 || !NILP (replace))
4275 {
4276 if (lseek (fd, XINT (beg), 0) < 0)
4277 report_file_error ("Setting file position",
4278 Fcons (orig_filename, Qnil));
4279 }
4280
4281 /* In the following loop, HOW_MUCH contains the total bytes read so
4282 far for a regular file, and not changed for a special file. But,
4283 before exiting the loop, it is set to a negative value if I/O
4284 error occurs. */
4285 how_much = 0;
4286
4287 /* Total bytes inserted. */
4288 inserted = 0;
4289
4290 /* Here, we don't do code conversion in the loop. It is done by
4291 code_convert_region after all data are read into the buffer. */
4292 {
4293 int gap_size = GAP_SIZE;
4294
4295 while (how_much < total)
4296 {
4297 /* try is reserved in some compilers (Microsoft C) */
4298 int trytry = min (total - how_much, READ_BUF_SIZE);
4299 int this;
4300
4301 if (not_regular)
4302 {
4303 Lisp_Object val;
4304
4305 /* Maybe make more room. */
4306 if (gap_size < trytry)
4307 {
4308 make_gap (total - gap_size);
4309 gap_size = GAP_SIZE;
4310 }
4311
4312 /* Read from the file, capturing `quit'. When an
4313 error occurs, end the loop, and arrange for a quit
4314 to be signaled after decoding the text we read. */
4315 non_regular_fd = fd;
4316 non_regular_inserted = inserted;
4317 non_regular_nbytes = trytry;
4318 val = internal_condition_case_1 (read_non_regular, Qnil, Qerror,
4319 read_non_regular_quit);
4320 if (NILP (val))
4321 {
4322 read_quit = 1;
4323 break;
4324 }
4325
4326 this = XINT (val);
4327 }
4328 else
4329 {
4330 /* Allow quitting out of the actual I/O. We don't make text
4331 part of the buffer until all the reading is done, so a C-g
4332 here doesn't do any harm. */
4333 immediate_quit = 1;
4334 QUIT;
4335 this = emacs_read (fd, BEG_ADDR + PT_BYTE - BEG_BYTE + inserted, trytry);
4336 immediate_quit = 0;
4337 }
4338
4339 if (this <= 0)
4340 {
4341 how_much = this;
4342 break;
4343 }
4344
4345 gap_size -= this;
4346
4347 /* For a regular file, where TOTAL is the real size,
4348 count HOW_MUCH to compare with it.
4349 For a special file, where TOTAL is just a buffer size,
4350 so don't bother counting in HOW_MUCH.
4351 (INSERTED is where we count the number of characters inserted.) */
4352 if (! not_regular)
4353 how_much += this;
4354 inserted += this;
4355 }
4356 }
4357
4358 /* Make the text read part of the buffer. */
4359 GAP_SIZE -= inserted;
4360 GPT += inserted;
4361 GPT_BYTE += inserted;
4362 ZV += inserted;
4363 ZV_BYTE += inserted;
4364 Z += inserted;
4365 Z_BYTE += inserted;
4366
4367 if (GAP_SIZE > 0)
4368 /* Put an anchor to ensure multi-byte form ends at gap. */
4369 *GPT_ADDR = 0;
4370
4371 emacs_close (fd);
4372
4373 /* Discard the unwind protect for closing the file. */
4374 specpdl_ptr--;
4375
4376 if (how_much < 0)
4377 error ("IO error reading %s: %s",
4378 SDATA (orig_filename), emacs_strerror (errno));
4379
4380 notfound:
4381
4382 if (! coding_system_decided)
4383 {
4384 /* The coding system is not yet decided. Decide it by an
4385 optimized method for handling `coding:' tag.
4386
4387 Note that we can get here only if the buffer was empty
4388 before the insertion. */
4389 Lisp_Object val;
4390 val = Qnil;
4391
4392 if (!NILP (Vcoding_system_for_read))
4393 val = Vcoding_system_for_read;
4394 else
4395 {
4396 /* Since we are sure that the current buffer was empty
4397 before the insertion, we can toggle
4398 enable-multibyte-characters directly here without taking
4399 care of marker adjustment and byte combining problem. By
4400 this way, we can run Lisp program safely before decoding
4401 the inserted text. */
4402 Lisp_Object unwind_data;
4403 int count = SPECPDL_INDEX ();
4404
4405 unwind_data = Fcons (current_buffer->enable_multibyte_characters,
4406 Fcons (current_buffer->undo_list,
4407 Fcurrent_buffer ()));
4408 current_buffer->enable_multibyte_characters = Qnil;
4409 current_buffer->undo_list = Qt;
4410 record_unwind_protect (decide_coding_unwind, unwind_data);
4411
4412 if (inserted > 0 && ! NILP (Vset_auto_coding_function))
4413 {
4414 val = call2 (Vset_auto_coding_function,
4415 filename, make_number (inserted));
4416 }
4417
4418 if (NILP (val))
4419 {
4420 /* If the coding system is not yet decided, check
4421 file-coding-system-alist. */
4422 Lisp_Object args[6], coding_systems;
4423
4424 args[0] = Qinsert_file_contents, args[1] = orig_filename;
4425 args[2] = visit, args[3] = beg, args[4] = end, args[5] = Qnil;
4426 coding_systems = Ffind_operation_coding_system (6, args);
4427 if (CONSP (coding_systems))
4428 val = XCAR (coding_systems);
4429 }
4430
4431 unbind_to (count, Qnil);
4432 inserted = Z_BYTE - BEG_BYTE;
4433 }
4434
4435 /* The following kludgy code is to avoid some compiler bug.
4436 We can't simply do
4437 setup_coding_system (val, &coding);
4438 on some system. */
4439 {
4440 struct coding_system temp_coding;
4441 setup_coding_system (val, &temp_coding);
4442 bcopy (&temp_coding, &coding, sizeof coding);
4443 }
4444 /* Ensure we set Vlast_coding_system_used. */
4445 set_coding_system = 1;
4446
4447 if (NILP (current_buffer->enable_multibyte_characters)
4448 && ! NILP (val))
4449 /* We must suppress all character code conversion except for
4450 end-of-line conversion. */
4451 setup_raw_text_coding_system (&coding);
4452 coding.src_multibyte = 0;
4453 coding.dst_multibyte
4454 = !NILP (current_buffer->enable_multibyte_characters);
4455 }
4456
4457 if (!NILP (visit)
4458 /* Can't do this if part of the buffer might be preserved. */
4459 && NILP (replace)
4460 && (coding.type == coding_type_no_conversion
4461 || coding.type == coding_type_raw_text))
4462 {
4463 /* Visiting a file with these coding system makes the buffer
4464 unibyte. */
4465 current_buffer->enable_multibyte_characters = Qnil;
4466 coding.dst_multibyte = 0;
4467 }
4468
4469 if (inserted > 0 || coding.type == coding_type_ccl)
4470 {
4471 if (CODING_MAY_REQUIRE_DECODING (&coding))
4472 {
4473 code_convert_region (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted,
4474 &coding, 0, 0);
4475 inserted = coding.produced_char;
4476 }
4477 else
4478 adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted,
4479 inserted);
4480 }
4481
4482 #ifdef DOS_NT
4483 /* Use the conversion type to determine buffer-file-type
4484 (find-buffer-file-type is now used to help determine the
4485 conversion). */
4486 if ((coding.eol_type == CODING_EOL_UNDECIDED
4487 || coding.eol_type == CODING_EOL_LF)
4488 && ! CODING_REQUIRE_DECODING (&coding))
4489 current_buffer->buffer_file_type = Qt;
4490 else
4491 current_buffer->buffer_file_type = Qnil;
4492 #endif
4493
4494 handled:
4495
4496 if (!NILP (visit))
4497 {
4498 if (!EQ (current_buffer->undo_list, Qt))
4499 current_buffer->undo_list = Qnil;
4500 #ifdef APOLLO
4501 stat (SDATA (filename), &st);
4502 #endif
4503
4504 if (NILP (handler))
4505 {
4506 current_buffer->modtime = st.st_mtime;
4507 current_buffer->filename = orig_filename;
4508 }
4509
4510 SAVE_MODIFF = MODIFF;
4511 current_buffer->auto_save_modified = MODIFF;
4512 XSETFASTINT (current_buffer->save_length, Z - BEG);
4513 #ifdef CLASH_DETECTION
4514 if (NILP (handler))
4515 {
4516 if (!NILP (current_buffer->file_truename))
4517 unlock_file (current_buffer->file_truename);
4518 unlock_file (filename);
4519 }
4520 #endif /* CLASH_DETECTION */
4521 if (not_regular)
4522 Fsignal (Qfile_error,
4523 Fcons (build_string ("not a regular file"),
4524 Fcons (orig_filename, Qnil)));
4525 }
4526
4527 /* Decode file format */
4528 if (inserted > 0)
4529 {
4530 int empty_undo_list_p = 0;
4531
4532 /* If we're anyway going to discard undo information, don't
4533 record it in the first place. The buffer's undo list at this
4534 point is either nil or t when visiting a file. */
4535 if (!NILP (visit))
4536 {
4537 empty_undo_list_p = NILP (current_buffer->undo_list);
4538 current_buffer->undo_list = Qt;
4539 }
4540
4541 insval = call3 (Qformat_decode,
4542 Qnil, make_number (inserted), visit);
4543 CHECK_NUMBER (insval);
4544 inserted = XFASTINT (insval);
4545
4546 if (!NILP (visit))
4547 current_buffer->undo_list = empty_undo_list_p ? Qnil : Qt;
4548 }
4549
4550 if (set_coding_system)
4551 Vlast_coding_system_used = coding.symbol;
4552
4553 /* Call after-change hooks for the inserted text, aside from the case
4554 of normal visiting (not with REPLACE), which is done in a new buffer
4555 "before" the buffer is changed. */
4556 if (inserted > 0 && total > 0
4557 && (NILP (visit) || !NILP (replace)))
4558 {
4559 signal_after_change (PT, 0, inserted);
4560 update_compositions (PT, PT, CHECK_BORDER);
4561 }
4562
4563 p = Vafter_insert_file_functions;
4564 while (CONSP (p))
4565 {
4566 insval = call1 (XCAR (p), make_number (inserted));
4567 if (!NILP (insval))
4568 {
4569 CHECK_NUMBER (insval);
4570 inserted = XFASTINT (insval);
4571 }
4572 QUIT;
4573 p = XCDR (p);
4574 }
4575
4576 if (!NILP (visit)
4577 && current_buffer->modtime == -1)
4578 {
4579 /* If visiting nonexistent file, return nil. */
4580 report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
4581 }
4582
4583 if (read_quit)
4584 Fsignal (Qquit, Qnil);
4585
4586 /* ??? Retval needs to be dealt with in all cases consistently. */
4587 if (NILP (val))
4588 val = Fcons (orig_filename,
4589 Fcons (make_number (inserted),
4590 Qnil));
4591
4592 RETURN_UNGCPRO (unbind_to (count, val));
4593 }
4594 \f
4595 static Lisp_Object build_annotations P_ ((Lisp_Object, Lisp_Object));
4596 static Lisp_Object build_annotations_2 P_ ((Lisp_Object, Lisp_Object,
4597 Lisp_Object, Lisp_Object));
4598
4599 /* If build_annotations switched buffers, switch back to BUF.
4600 Kill the temporary buffer that was selected in the meantime.
4601
4602 Since this kill only the last temporary buffer, some buffers remain
4603 not killed if build_annotations switched buffers more than once.
4604 -- K.Handa */
4605
4606 static Lisp_Object
4607 build_annotations_unwind (buf)
4608 Lisp_Object buf;
4609 {
4610 Lisp_Object tembuf;
4611
4612 if (XBUFFER (buf) == current_buffer)
4613 return Qnil;
4614 tembuf = Fcurrent_buffer ();
4615 Fset_buffer (buf);
4616 Fkill_buffer (tembuf);
4617 return Qnil;
4618 }
4619
4620 /* Decide the coding-system to encode the data with. */
4621
4622 void
4623 choose_write_coding_system (start, end, filename,
4624 append, visit, lockname, coding)
4625 Lisp_Object start, end, filename, append, visit, lockname;
4626 struct coding_system *coding;
4627 {
4628 Lisp_Object val;
4629
4630 if (auto_saving)
4631 val = Qnil;
4632 else if (!NILP (Vcoding_system_for_write))
4633 val = Vcoding_system_for_write;
4634 else
4635 {
4636 /* If the variable `buffer-file-coding-system' is set locally,
4637 it means that the file was read with some kind of code
4638 conversion or the variable is explicitly set by users. We
4639 had better write it out with the same coding system even if
4640 `enable-multibyte-characters' is nil.
4641
4642 If it is not set locally, we anyway have to convert EOL
4643 format if the default value of `buffer-file-coding-system'
4644 tells that it is not Unix-like (LF only) format. */
4645 int using_default_coding = 0;
4646 int force_raw_text = 0;
4647
4648 val = current_buffer->buffer_file_coding_system;
4649 if (NILP (val)
4650 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
4651 {
4652 val = Qnil;
4653 if (NILP (current_buffer->enable_multibyte_characters))
4654 force_raw_text = 1;
4655 }
4656
4657 if (NILP (val))
4658 {
4659 /* Check file-coding-system-alist. */
4660 Lisp_Object args[7], coding_systems;
4661
4662 args[0] = Qwrite_region; args[1] = start; args[2] = end;
4663 args[3] = filename; args[4] = append; args[5] = visit;
4664 args[6] = lockname;
4665 coding_systems = Ffind_operation_coding_system (7, args);
4666 if (CONSP (coding_systems) && !NILP (XCDR (coding_systems)))
4667 val = XCDR (coding_systems);
4668 }
4669
4670 if (NILP (val)
4671 && !NILP (current_buffer->buffer_file_coding_system))
4672 {
4673 /* If we still have not decided a coding system, use the
4674 default value of buffer-file-coding-system. */
4675 val = current_buffer->buffer_file_coding_system;
4676 using_default_coding = 1;
4677 }
4678
4679 if (!force_raw_text
4680 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4681 /* Confirm that VAL can surely encode the current region. */
4682 val = call5 (Vselect_safe_coding_system_function,
4683 start, end, val, Qnil, filename);
4684
4685 setup_coding_system (Fcheck_coding_system (val), coding);
4686 if (coding->eol_type == CODING_EOL_UNDECIDED
4687 && !using_default_coding)
4688 {
4689 if (! EQ (default_buffer_file_coding.symbol,
4690 buffer_defaults.buffer_file_coding_system))
4691 setup_coding_system (buffer_defaults.buffer_file_coding_system,
4692 &default_buffer_file_coding);
4693 if (default_buffer_file_coding.eol_type != CODING_EOL_UNDECIDED)
4694 {
4695 Lisp_Object subsidiaries;
4696
4697 coding->eol_type = default_buffer_file_coding.eol_type;
4698 subsidiaries = Fget (coding->symbol, Qeol_type);
4699 if (VECTORP (subsidiaries)
4700 && XVECTOR (subsidiaries)->size == 3)
4701 coding->symbol
4702 = XVECTOR (subsidiaries)->contents[coding->eol_type];
4703 }
4704 }
4705
4706 if (force_raw_text)
4707 setup_raw_text_coding_system (coding);
4708 goto done_setup_coding;
4709 }
4710
4711 setup_coding_system (Fcheck_coding_system (val), coding);
4712
4713 done_setup_coding:
4714 if (!STRINGP (start) && !NILP (current_buffer->selective_display))
4715 coding->mode |= CODING_MODE_SELECTIVE_DISPLAY;
4716 }
4717
4718 DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 7,
4719 "r\nFWrite region to file: \ni\ni\ni\np",
4720 doc: /* Write current region into specified file.
4721 When called from a program, requires three arguments:
4722 START, END and FILENAME. START and END are normally buffer positions
4723 specifying the part of the buffer to write.
4724 If START is nil, that means to use the entire buffer contents.
4725 If START is a string, then output that string to the file
4726 instead of any buffer contents; END is ignored.
4727
4728 Optional fourth argument APPEND if non-nil means
4729 append to existing file contents (if any). If it is an integer,
4730 seek to that offset in the file before writing.
4731 Optional fifth argument VISIT if t means
4732 set the last-save-file-modtime of buffer to this file's modtime
4733 and mark buffer not modified.
4734 If VISIT is a string, it is a second file name;
4735 the output goes to FILENAME, but the buffer is marked as visiting VISIT.
4736 VISIT is also the file name to lock and unlock for clash detection.
4737 If VISIT is neither t nor nil nor a string,
4738 that means do not display the \"Wrote file\" message.
4739 The optional sixth arg LOCKNAME, if non-nil, specifies the name to
4740 use for locking and unlocking, overriding FILENAME and VISIT.
4741 The optional seventh arg MUSTBENEW, if non-nil, insists on a check
4742 for an existing file with the same name. If MUSTBENEW is `excl',
4743 that means to get an error if the file already exists; never overwrite.
4744 If MUSTBENEW is neither nil nor `excl', that means ask for
4745 confirmation before overwriting, but do go ahead and overwrite the file
4746 if the user confirms.
4747
4748 This does code conversion according to the value of
4749 `coding-system-for-write', `buffer-file-coding-system', or
4750 `file-coding-system-alist', and sets the variable
4751 `last-coding-system-used' to the coding system actually used. */)
4752 (start, end, filename, append, visit, lockname, mustbenew)
4753 Lisp_Object start, end, filename, append, visit, lockname, mustbenew;
4754 {
4755 register int desc;
4756 int failure;
4757 int save_errno = 0;
4758 const unsigned char *fn;
4759 struct stat st;
4760 int tem;
4761 int count = SPECPDL_INDEX ();
4762 int count1;
4763 #ifdef VMS
4764 unsigned char *fname = 0; /* If non-0, original filename (must rename) */
4765 #endif /* VMS */
4766 Lisp_Object handler;
4767 Lisp_Object visit_file;
4768 Lisp_Object annotations;
4769 Lisp_Object encoded_filename;
4770 int visiting = (EQ (visit, Qt) || STRINGP (visit));
4771 int quietly = !NILP (visit);
4772 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
4773 struct buffer *given_buffer;
4774 #ifdef DOS_NT
4775 int buffer_file_type = O_BINARY;
4776 #endif /* DOS_NT */
4777 struct coding_system coding;
4778
4779 if (current_buffer->base_buffer && visiting)
4780 error ("Cannot do file visiting in an indirect buffer");
4781
4782 if (!NILP (start) && !STRINGP (start))
4783 validate_region (&start, &end);
4784
4785 GCPRO5 (start, filename, visit, visit_file, lockname);
4786
4787 filename = Fexpand_file_name (filename, Qnil);
4788
4789 if (!NILP (mustbenew) && !EQ (mustbenew, Qexcl))
4790 barf_or_query_if_file_exists (filename, "overwrite", 1, 0, 1);
4791
4792 if (STRINGP (visit))
4793 visit_file = Fexpand_file_name (visit, Qnil);
4794 else
4795 visit_file = filename;
4796
4797 if (NILP (lockname))
4798 lockname = visit_file;
4799
4800 annotations = Qnil;
4801
4802 /* If the file name has special constructs in it,
4803 call the corresponding file handler. */
4804 handler = Ffind_file_name_handler (filename, Qwrite_region);
4805 /* If FILENAME has no handler, see if VISIT has one. */
4806 if (NILP (handler) && STRINGP (visit))
4807 handler = Ffind_file_name_handler (visit, Qwrite_region);
4808
4809 if (!NILP (handler))
4810 {
4811 Lisp_Object val;
4812 val = call6 (handler, Qwrite_region, start, end,
4813 filename, append, visit);
4814
4815 if (visiting)
4816 {
4817 SAVE_MODIFF = MODIFF;
4818 XSETFASTINT (current_buffer->save_length, Z - BEG);
4819 current_buffer->filename = visit_file;
4820 }
4821 UNGCPRO;
4822 return val;
4823 }
4824
4825 /* Special kludge to simplify auto-saving. */
4826 if (NILP (start))
4827 {
4828 XSETFASTINT (start, BEG);
4829 XSETFASTINT (end, Z);
4830 }
4831
4832 record_unwind_protect (build_annotations_unwind, Fcurrent_buffer ());
4833 count1 = SPECPDL_INDEX ();
4834
4835 given_buffer = current_buffer;
4836
4837 if (!STRINGP (start))
4838 {
4839 annotations = build_annotations (start, end);
4840
4841 if (current_buffer != given_buffer)
4842 {
4843 XSETFASTINT (start, BEGV);
4844 XSETFASTINT (end, ZV);
4845 }
4846 }
4847
4848 UNGCPRO;
4849
4850 GCPRO5 (start, filename, annotations, visit_file, lockname);
4851
4852 /* Decide the coding-system to encode the data with.
4853 We used to make this choice before calling build_annotations, but that
4854 leads to problems when a write-annotate-function takes care of
4855 unsavable chars (as was the case with X-Symbol). */
4856 choose_write_coding_system (start, end, filename,
4857 append, visit, lockname, &coding);
4858 Vlast_coding_system_used = coding.symbol;
4859
4860 given_buffer = current_buffer;
4861 if (! STRINGP (start))
4862 {
4863 annotations = build_annotations_2 (start, end,
4864 coding.pre_write_conversion, annotations);
4865 if (current_buffer != given_buffer)
4866 {
4867 XSETFASTINT (start, BEGV);
4868 XSETFASTINT (end, ZV);
4869 }
4870 }
4871
4872 #ifdef CLASH_DETECTION
4873 if (!auto_saving)
4874 {
4875 #if 0 /* This causes trouble for GNUS. */
4876 /* If we've locked this file for some other buffer,
4877 query before proceeding. */
4878 if (!visiting && EQ (Ffile_locked_p (lockname), Qt))
4879 call2 (intern ("ask-user-about-lock"), filename, Vuser_login_name);
4880 #endif
4881
4882 lock_file (lockname);
4883 }
4884 #endif /* CLASH_DETECTION */
4885
4886 encoded_filename = ENCODE_FILE (filename);
4887
4888 fn = SDATA (encoded_filename);
4889 desc = -1;
4890 if (!NILP (append))
4891 #ifdef DOS_NT
4892 desc = emacs_open (fn, O_WRONLY | buffer_file_type, 0);
4893 #else /* not DOS_NT */
4894 desc = emacs_open (fn, O_WRONLY, 0);
4895 #endif /* not DOS_NT */
4896
4897 if (desc < 0 && (NILP (append) || errno == ENOENT))
4898 #ifdef VMS
4899 if (auto_saving) /* Overwrite any previous version of autosave file */
4900 {
4901 vms_truncate (fn); /* if fn exists, truncate to zero length */
4902 desc = emacs_open (fn, O_RDWR, 0);
4903 if (desc < 0)
4904 desc = creat_copy_attrs (STRINGP (current_buffer->filename)
4905 ? SDATA (current_buffer->filename) : 0,
4906 fn);
4907 }
4908 else /* Write to temporary name and rename if no errors */
4909 {
4910 Lisp_Object temp_name;
4911 temp_name = Ffile_name_directory (filename);
4912
4913 if (!NILP (temp_name))
4914 {
4915 temp_name = Fmake_temp_name (concat2 (temp_name,
4916 build_string ("$$SAVE$$")));
4917 fname = SDATA (filename);
4918 fn = SDATA (temp_name);
4919 desc = creat_copy_attrs (fname, fn);
4920 if (desc < 0)
4921 {
4922 /* If we can't open the temporary file, try creating a new
4923 version of the original file. VMS "creat" creates a
4924 new version rather than truncating an existing file. */
4925 fn = fname;
4926 fname = 0;
4927 desc = creat (fn, 0666);
4928 #if 0 /* This can clobber an existing file and fail to replace it,
4929 if the user runs out of space. */
4930 if (desc < 0)
4931 {
4932 /* We can't make a new version;
4933 try to truncate and rewrite existing version if any. */
4934 vms_truncate (fn);
4935 desc = emacs_open (fn, O_RDWR, 0);
4936 }
4937 #endif
4938 }
4939 }
4940 else
4941 desc = creat (fn, 0666);
4942 }
4943 #else /* not VMS */
4944 #ifdef DOS_NT
4945 desc = emacs_open (fn,
4946 O_WRONLY | O_CREAT | buffer_file_type
4947 | (EQ (mustbenew, Qexcl) ? O_EXCL : O_TRUNC),
4948 S_IREAD | S_IWRITE);
4949 #else /* not DOS_NT */
4950 desc = emacs_open (fn, O_WRONLY | O_TRUNC | O_CREAT
4951 | (EQ (mustbenew, Qexcl) ? O_EXCL : 0),
4952 auto_saving ? auto_save_mode_bits : 0666);
4953 #endif /* not DOS_NT */
4954 #endif /* not VMS */
4955
4956 if (desc < 0)
4957 {
4958 #ifdef CLASH_DETECTION
4959 save_errno = errno;
4960 if (!auto_saving) unlock_file (lockname);
4961 errno = save_errno;
4962 #endif /* CLASH_DETECTION */
4963 UNGCPRO;
4964 report_file_error ("Opening output file", Fcons (filename, Qnil));
4965 }
4966
4967 record_unwind_protect (close_file_unwind, make_number (desc));
4968
4969 if (!NILP (append) && !NILP (Ffile_regular_p (filename)))
4970 {
4971 long ret;
4972
4973 if (NUMBERP (append))
4974 ret = lseek (desc, XINT (append), 1);
4975 else
4976 ret = lseek (desc, 0, 2);
4977 if (ret < 0)
4978 {
4979 #ifdef CLASH_DETECTION
4980 if (!auto_saving) unlock_file (lockname);
4981 #endif /* CLASH_DETECTION */
4982 UNGCPRO;
4983 report_file_error ("Lseek error", Fcons (filename, Qnil));
4984 }
4985 }
4986
4987 UNGCPRO;
4988
4989 #ifdef VMS
4990 /*
4991 * Kludge Warning: The VMS C RTL likes to insert carriage returns
4992 * if we do writes that don't end with a carriage return. Furthermore
4993 * it cannot handle writes of more then 16K. The modified
4994 * version of "sys_write" in SYSDEP.C (see comment there) copes with
4995 * this EXCEPT for the last record (iff it doesn't end with a carriage
4996 * return). This implies that if your buffer doesn't end with a carriage
4997 * return, you get one free... tough. However it also means that if
4998 * we make two calls to sys_write (a la the following code) you can
4999 * get one at the gap as well. The easiest way to fix this (honest)
5000 * is to move the gap to the next newline (or the end of the buffer).
5001 * Thus this change.
5002 *
5003 * Yech!
5004 */
5005 if (GPT > BEG && GPT_ADDR[-1] != '\n')
5006 move_gap (find_next_newline (GPT, 1));
5007 #else
5008 /* Whether VMS or not, we must move the gap to the next of newline
5009 when we must put designation sequences at beginning of line. */
5010 if (INTEGERP (start)
5011 && coding.type == coding_type_iso2022
5012 && coding.flags & CODING_FLAG_ISO_DESIGNATE_AT_BOL
5013 && GPT > BEG && GPT_ADDR[-1] != '\n')
5014 {
5015 int opoint = PT, opoint_byte = PT_BYTE;
5016 scan_newline (PT, PT_BYTE, ZV, ZV_BYTE, 1, 0);
5017 move_gap_both (PT, PT_BYTE);
5018 SET_PT_BOTH (opoint, opoint_byte);
5019 }
5020 #endif
5021
5022 failure = 0;
5023 immediate_quit = 1;
5024
5025 if (STRINGP (start))
5026 {
5027 failure = 0 > a_write (desc, start, 0, SCHARS (start),
5028 &annotations, &coding);
5029 save_errno = errno;
5030 }
5031 else if (XINT (start) != XINT (end))
5032 {
5033 tem = CHAR_TO_BYTE (XINT (start));
5034
5035 if (XINT (start) < GPT)
5036 {
5037 failure = 0 > a_write (desc, Qnil, XINT (start),
5038 min (GPT, XINT (end)) - XINT (start),
5039 &annotations, &coding);
5040 save_errno = errno;
5041 }
5042
5043 if (XINT (end) > GPT && !failure)
5044 {
5045 tem = max (XINT (start), GPT);
5046 failure = 0 > a_write (desc, Qnil, tem , XINT (end) - tem,
5047 &annotations, &coding);
5048 save_errno = errno;
5049 }
5050 }
5051 else
5052 {
5053 /* If file was empty, still need to write the annotations */
5054 coding.mode |= CODING_MODE_LAST_BLOCK;
5055 failure = 0 > a_write (desc, Qnil, XINT (end), 0, &annotations, &coding);
5056 save_errno = errno;
5057 }
5058
5059 if (CODING_REQUIRE_FLUSHING (&coding)
5060 && !(coding.mode & CODING_MODE_LAST_BLOCK)
5061 && ! failure)
5062 {
5063 /* We have to flush out a data. */
5064 coding.mode |= CODING_MODE_LAST_BLOCK;
5065 failure = 0 > e_write (desc, Qnil, 0, 0, &coding);
5066 save_errno = errno;
5067 }
5068
5069 immediate_quit = 0;
5070
5071 #ifdef HAVE_FSYNC
5072 /* Note fsync appears to change the modtime on BSD4.2 (both vax and sun).
5073 Disk full in NFS may be reported here. */
5074 /* mib says that closing the file will try to write as fast as NFS can do
5075 it, and that means the fsync here is not crucial for autosave files. */
5076 if (!auto_saving && fsync (desc) < 0)
5077 {
5078 /* If fsync fails with EINTR, don't treat that as serious. */
5079 if (errno != EINTR)
5080 failure = 1, save_errno = errno;
5081 }
5082 #endif
5083
5084 /* Spurious "file has changed on disk" warnings have been
5085 observed on Suns as well.
5086 It seems that `close' can change the modtime, under nfs.
5087
5088 (This has supposedly been fixed in Sunos 4,
5089 but who knows about all the other machines with NFS?) */
5090 #if 0
5091
5092 /* On VMS and APOLLO, must do the stat after the close
5093 since closing changes the modtime. */
5094 #ifndef VMS
5095 #ifndef APOLLO
5096 /* Recall that #if defined does not work on VMS. */
5097 #define FOO
5098 fstat (desc, &st);
5099 #endif
5100 #endif
5101 #endif
5102
5103 /* NFS can report a write failure now. */
5104 if (emacs_close (desc) < 0)
5105 failure = 1, save_errno = errno;
5106
5107 #ifdef VMS
5108 /* If we wrote to a temporary name and had no errors, rename to real name. */
5109 if (fname)
5110 {
5111 if (!failure)
5112 failure = (rename (fn, fname) != 0), save_errno = errno;
5113 fn = fname;
5114 }
5115 #endif /* VMS */
5116
5117 #ifndef FOO
5118 stat (fn, &st);
5119 #endif
5120 /* Discard the unwind protect for close_file_unwind. */
5121 specpdl_ptr = specpdl + count1;
5122 /* Restore the original current buffer. */
5123 visit_file = unbind_to (count, visit_file);
5124
5125 #ifdef CLASH_DETECTION
5126 if (!auto_saving)
5127 unlock_file (lockname);
5128 #endif /* CLASH_DETECTION */
5129
5130 /* Do this before reporting IO error
5131 to avoid a "file has changed on disk" warning on
5132 next attempt to save. */
5133 if (visiting)
5134 current_buffer->modtime = st.st_mtime;
5135
5136 if (failure)
5137 error ("IO error writing %s: %s", SDATA (filename),
5138 emacs_strerror (save_errno));
5139
5140 if (visiting)
5141 {
5142 SAVE_MODIFF = MODIFF;
5143 XSETFASTINT (current_buffer->save_length, Z - BEG);
5144 current_buffer->filename = visit_file;
5145 update_mode_lines++;
5146 }
5147 else if (quietly)
5148 return Qnil;
5149
5150 if (!auto_saving)
5151 message_with_string ("Wrote %s", visit_file, 1);
5152
5153 return Qnil;
5154 }
5155 \f
5156 Lisp_Object merge ();
5157
5158 DEFUN ("car-less-than-car", Fcar_less_than_car, Scar_less_than_car, 2, 2, 0,
5159 doc: /* Return t if (car A) is numerically less than (car B). */)
5160 (a, b)
5161 Lisp_Object a, b;
5162 {
5163 return Flss (Fcar (a), Fcar (b));
5164 }
5165
5166 /* Build the complete list of annotations appropriate for writing out
5167 the text between START and END, by calling all the functions in
5168 write-region-annotate-functions and merging the lists they return.
5169 If one of these functions switches to a different buffer, we assume
5170 that buffer contains altered text. Therefore, the caller must
5171 make sure to restore the current buffer in all cases,
5172 as save-excursion would do. */
5173
5174 static Lisp_Object
5175 build_annotations (start, end)
5176 Lisp_Object start, end;
5177 {
5178 Lisp_Object annotations;
5179 Lisp_Object p, res;
5180 struct gcpro gcpro1, gcpro2;
5181 Lisp_Object original_buffer;
5182 int i;
5183
5184 XSETBUFFER (original_buffer, current_buffer);
5185
5186 annotations = Qnil;
5187 p = Vwrite_region_annotate_functions;
5188 GCPRO2 (annotations, p);
5189 while (CONSP (p))
5190 {
5191 struct buffer *given_buffer = current_buffer;
5192 Vwrite_region_annotations_so_far = annotations;
5193 res = call2 (XCAR (p), start, end);
5194 /* If the function makes a different buffer current,
5195 assume that means this buffer contains altered text to be output.
5196 Reset START and END from the buffer bounds
5197 and discard all previous annotations because they should have
5198 been dealt with by this function. */
5199 if (current_buffer != given_buffer)
5200 {
5201 XSETFASTINT (start, BEGV);
5202 XSETFASTINT (end, ZV);
5203 annotations = Qnil;
5204 }
5205 Flength (res); /* Check basic validity of return value */
5206 annotations = merge (annotations, res, Qcar_less_than_car);
5207 p = XCDR (p);
5208 }
5209
5210 /* Now do the same for annotation functions implied by the file-format */
5211 if (auto_saving && (!EQ (Vauto_save_file_format, Qt)))
5212 p = Vauto_save_file_format;
5213 else
5214 p = current_buffer->file_format;
5215 for (i = 0; CONSP (p); p = XCDR (p), ++i)
5216 {
5217 struct buffer *given_buffer = current_buffer;
5218
5219 Vwrite_region_annotations_so_far = annotations;
5220
5221 /* Value is either a list of annotations or nil if the function
5222 has written annotations to a temporary buffer, which is now
5223 current. */
5224 res = call5 (Qformat_annotate_function, XCAR (p), start, end,
5225 original_buffer, make_number (i));
5226 if (current_buffer != given_buffer)
5227 {
5228 XSETFASTINT (start, BEGV);
5229 XSETFASTINT (end, ZV);
5230 annotations = Qnil;
5231 }
5232
5233 if (CONSP (res))
5234 annotations = merge (annotations, res, Qcar_less_than_car);
5235 }
5236
5237 UNGCPRO;
5238 return annotations;
5239 }
5240
5241 static Lisp_Object
5242 build_annotations_2 (start, end, pre_write_conversion, annotations)
5243 Lisp_Object start, end, pre_write_conversion, annotations;
5244 {
5245 struct gcpro gcpro1;
5246 Lisp_Object res;
5247
5248 GCPRO1 (annotations);
5249 /* At last, do the same for the function PRE_WRITE_CONVERSION
5250 implied by the current coding-system. */
5251 if (!NILP (pre_write_conversion))
5252 {
5253 struct buffer *given_buffer = current_buffer;
5254 Vwrite_region_annotations_so_far = annotations;
5255 res = call2 (pre_write_conversion, start, end);
5256 Flength (res);
5257 annotations = (current_buffer != given_buffer
5258 ? res
5259 : merge (annotations, res, Qcar_less_than_car));
5260 }
5261
5262 UNGCPRO;
5263 return annotations;
5264 }
5265 \f
5266 /* Write to descriptor DESC the NCHARS chars starting at POS of STRING.
5267 If STRING is nil, POS is the character position in the current buffer.
5268 Intersperse with them the annotations from *ANNOT
5269 which fall within the range of POS to POS + NCHARS,
5270 each at its appropriate position.
5271
5272 We modify *ANNOT by discarding elements as we use them up.
5273
5274 The return value is negative in case of system call failure. */
5275
5276 static int
5277 a_write (desc, string, pos, nchars, annot, coding)
5278 int desc;
5279 Lisp_Object string;
5280 register int nchars;
5281 int pos;
5282 Lisp_Object *annot;
5283 struct coding_system *coding;
5284 {
5285 Lisp_Object tem;
5286 int nextpos;
5287 int lastpos = pos + nchars;
5288
5289 while (NILP (*annot) || CONSP (*annot))
5290 {
5291 tem = Fcar_safe (Fcar (*annot));
5292 nextpos = pos - 1;
5293 if (INTEGERP (tem))
5294 nextpos = XFASTINT (tem);
5295
5296 /* If there are no more annotations in this range,
5297 output the rest of the range all at once. */
5298 if (! (nextpos >= pos && nextpos <= lastpos))
5299 return e_write (desc, string, pos, lastpos, coding);
5300
5301 /* Output buffer text up to the next annotation's position. */
5302 if (nextpos > pos)
5303 {
5304 if (0 > e_write (desc, string, pos, nextpos, coding))
5305 return -1;
5306 pos = nextpos;
5307 }
5308 /* Output the annotation. */
5309 tem = Fcdr (Fcar (*annot));
5310 if (STRINGP (tem))
5311 {
5312 if (0 > e_write (desc, tem, 0, SCHARS (tem), coding))
5313 return -1;
5314 }
5315 *annot = Fcdr (*annot);
5316 }
5317 return 0;
5318 }
5319
5320 #ifndef WRITE_BUF_SIZE
5321 #define WRITE_BUF_SIZE (16 * 1024)
5322 #endif
5323
5324 /* Write text in the range START and END into descriptor DESC,
5325 encoding them with coding system CODING. If STRING is nil, START
5326 and END are character positions of the current buffer, else they
5327 are indexes to the string STRING. */
5328
5329 static int
5330 e_write (desc, string, start, end, coding)
5331 int desc;
5332 Lisp_Object string;
5333 int start, end;
5334 struct coding_system *coding;
5335 {
5336 register char *addr;
5337 register int nbytes;
5338 char buf[WRITE_BUF_SIZE];
5339 int return_val = 0;
5340
5341 if (start >= end)
5342 coding->composing = COMPOSITION_DISABLED;
5343 if (coding->composing != COMPOSITION_DISABLED)
5344 coding_save_composition (coding, start, end, string);
5345
5346 if (STRINGP (string))
5347 {
5348 addr = SDATA (string);
5349 nbytes = SBYTES (string);
5350 coding->src_multibyte = STRING_MULTIBYTE (string);
5351 }
5352 else if (start < end)
5353 {
5354 /* It is assured that the gap is not in the range START and END-1. */
5355 addr = CHAR_POS_ADDR (start);
5356 nbytes = CHAR_TO_BYTE (end) - CHAR_TO_BYTE (start);
5357 coding->src_multibyte
5358 = !NILP (current_buffer->enable_multibyte_characters);
5359 }
5360 else
5361 {
5362 addr = "";
5363 nbytes = 0;
5364 coding->src_multibyte = 1;
5365 }
5366
5367 /* We used to have a code for handling selective display here. But,
5368 now it is handled within encode_coding. */
5369 while (1)
5370 {
5371 int result;
5372
5373 result = encode_coding (coding, addr, buf, nbytes, WRITE_BUF_SIZE);
5374 if (coding->produced > 0)
5375 {
5376 coding->produced -= emacs_write (desc, buf, coding->produced);
5377 if (coding->produced)
5378 {
5379 return_val = -1;
5380 break;
5381 }
5382 }
5383 nbytes -= coding->consumed;
5384 addr += coding->consumed;
5385 if (result == CODING_FINISH_INSUFFICIENT_SRC
5386 && nbytes > 0)
5387 {
5388 /* The source text ends by an incomplete multibyte form.
5389 There's no way other than write it out as is. */
5390 nbytes -= emacs_write (desc, addr, nbytes);
5391 if (nbytes)
5392 {
5393 return_val = -1;
5394 break;
5395 }
5396 }
5397 if (nbytes <= 0)
5398 break;
5399 start += coding->consumed_char;
5400 if (coding->cmp_data)
5401 coding_adjust_composition_offset (coding, start);
5402 }
5403
5404 if (coding->cmp_data)
5405 coding_free_composition_data (coding);
5406
5407 return return_val;
5408 }
5409 \f
5410 DEFUN ("verify-visited-file-modtime", Fverify_visited_file_modtime,
5411 Sverify_visited_file_modtime, 1, 1, 0,
5412 doc: /* Return t if last mod time of BUF's visited file matches what BUF records.
5413 This means that the file has not been changed since it was visited or saved. */)
5414 (buf)
5415 Lisp_Object buf;
5416 {
5417 struct buffer *b;
5418 struct stat st;
5419 Lisp_Object handler;
5420 Lisp_Object filename;
5421
5422 CHECK_BUFFER (buf);
5423 b = XBUFFER (buf);
5424
5425 if (!STRINGP (b->filename)) return Qt;
5426 if (b->modtime == 0) return Qt;
5427
5428 /* If the file name has special constructs in it,
5429 call the corresponding file handler. */
5430 handler = Ffind_file_name_handler (b->filename,
5431 Qverify_visited_file_modtime);
5432 if (!NILP (handler))
5433 return call2 (handler, Qverify_visited_file_modtime, buf);
5434
5435 filename = ENCODE_FILE (b->filename);
5436
5437 if (stat (SDATA (filename), &st) < 0)
5438 {
5439 /* If the file doesn't exist now and didn't exist before,
5440 we say that it isn't modified, provided the error is a tame one. */
5441 if (errno == ENOENT || errno == EACCES || errno == ENOTDIR)
5442 st.st_mtime = -1;
5443 else
5444 st.st_mtime = 0;
5445 }
5446 if (st.st_mtime == b->modtime
5447 /* If both are positive, accept them if they are off by one second. */
5448 || (st.st_mtime > 0 && b->modtime > 0
5449 && (st.st_mtime == b->modtime + 1
5450 || st.st_mtime == b->modtime - 1)))
5451 return Qt;
5452 return Qnil;
5453 }
5454
5455 DEFUN ("clear-visited-file-modtime", Fclear_visited_file_modtime,
5456 Sclear_visited_file_modtime, 0, 0, 0,
5457 doc: /* Clear out records of last mod time of visited file.
5458 Next attempt to save will certainly not complain of a discrepancy. */)
5459 ()
5460 {
5461 current_buffer->modtime = 0;
5462 return Qnil;
5463 }
5464
5465 DEFUN ("visited-file-modtime", Fvisited_file_modtime,
5466 Svisited_file_modtime, 0, 0, 0,
5467 doc: /* Return the current buffer's recorded visited file modification time.
5468 The value is a list of the form (HIGH . LOW), like the time values
5469 that `file-attributes' returns. */)
5470 ()
5471 {
5472 return long_to_cons ((unsigned long) current_buffer->modtime);
5473 }
5474
5475 DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime,
5476 Sset_visited_file_modtime, 0, 1, 0,
5477 doc: /* Update buffer's recorded modification time from the visited file's time.
5478 Useful if the buffer was not read from the file normally
5479 or if the file itself has been changed for some known benign reason.
5480 An argument specifies the modification time value to use
5481 \(instead of that of the visited file), in the form of a list
5482 \(HIGH . LOW) or (HIGH LOW). */)
5483 (time_list)
5484 Lisp_Object time_list;
5485 {
5486 if (!NILP (time_list))
5487 current_buffer->modtime = cons_to_long (time_list);
5488 else
5489 {
5490 register Lisp_Object filename;
5491 struct stat st;
5492 Lisp_Object handler;
5493
5494 filename = Fexpand_file_name (current_buffer->filename, Qnil);
5495
5496 /* If the file name has special constructs in it,
5497 call the corresponding file handler. */
5498 handler = Ffind_file_name_handler (filename, Qset_visited_file_modtime);
5499 if (!NILP (handler))
5500 /* The handler can find the file name the same way we did. */
5501 return call2 (handler, Qset_visited_file_modtime, Qnil);
5502
5503 filename = ENCODE_FILE (filename);
5504
5505 if (stat (SDATA (filename), &st) >= 0)
5506 current_buffer->modtime = st.st_mtime;
5507 }
5508
5509 return Qnil;
5510 }
5511 \f
5512 Lisp_Object
5513 auto_save_error (error)
5514 Lisp_Object error;
5515 {
5516 Lisp_Object args[3], msg;
5517 int i, nbytes;
5518 struct gcpro gcpro1;
5519
5520 ring_bell ();
5521
5522 args[0] = build_string ("Auto-saving %s: %s");
5523 args[1] = current_buffer->name;
5524 args[2] = Ferror_message_string (error);
5525 msg = Fformat (3, args);
5526 GCPRO1 (msg);
5527 nbytes = SBYTES (msg);
5528
5529 for (i = 0; i < 3; ++i)
5530 {
5531 if (i == 0)
5532 message2 (SDATA (msg), nbytes, STRING_MULTIBYTE (msg));
5533 else
5534 message2_nolog (SDATA (msg), nbytes, STRING_MULTIBYTE (msg));
5535 Fsleep_for (make_number (1), Qnil);
5536 }
5537
5538 UNGCPRO;
5539 return Qnil;
5540 }
5541
5542 Lisp_Object
5543 auto_save_1 ()
5544 {
5545 struct stat st;
5546
5547 /* Get visited file's mode to become the auto save file's mode. */
5548 if (! NILP (current_buffer->filename)
5549 && stat (SDATA (current_buffer->filename), &st) >= 0)
5550 /* But make sure we can overwrite it later! */
5551 auto_save_mode_bits = st.st_mode | 0600;
5552 else
5553 auto_save_mode_bits = 0666;
5554
5555 return
5556 Fwrite_region (Qnil, Qnil,
5557 current_buffer->auto_save_file_name,
5558 Qnil, Qlambda, Qnil, Qnil);
5559 }
5560
5561 static Lisp_Object
5562 do_auto_save_unwind (stream) /* used as unwind-protect function */
5563 Lisp_Object stream;
5564 {
5565 auto_saving = 0;
5566 if (!NILP (stream))
5567 fclose ((FILE *) (XFASTINT (XCAR (stream)) << 16
5568 | XFASTINT (XCDR (stream))));
5569 return Qnil;
5570 }
5571
5572 static Lisp_Object
5573 do_auto_save_unwind_1 (value) /* used as unwind-protect function */
5574 Lisp_Object value;
5575 {
5576 minibuffer_auto_raise = XINT (value);
5577 return Qnil;
5578 }
5579
5580 static Lisp_Object
5581 do_auto_save_make_dir (dir)
5582 Lisp_Object dir;
5583 {
5584 return call2 (Qmake_directory, dir, Qt);
5585 }
5586
5587 static Lisp_Object
5588 do_auto_save_eh (ignore)
5589 Lisp_Object ignore;
5590 {
5591 return Qnil;
5592 }
5593
5594 DEFUN ("do-auto-save", Fdo_auto_save, Sdo_auto_save, 0, 2, "",
5595 doc: /* Auto-save all buffers that need it.
5596 This is all buffers that have auto-saving enabled
5597 and are changed since last auto-saved.
5598 Auto-saving writes the buffer into a file
5599 so that your editing is not lost if the system crashes.
5600 This file is not the file you visited; that changes only when you save.
5601 Normally we run the normal hook `auto-save-hook' before saving.
5602
5603 A non-nil NO-MESSAGE argument means do not print any message if successful.
5604 A non-nil CURRENT-ONLY argument means save only current buffer. */)
5605 (no_message, current_only)
5606 Lisp_Object no_message, current_only;
5607 {
5608 struct buffer *old = current_buffer, *b;
5609 Lisp_Object tail, buf;
5610 int auto_saved = 0;
5611 int do_handled_files;
5612 Lisp_Object oquit;
5613 FILE *stream;
5614 Lisp_Object lispstream;
5615 int count = SPECPDL_INDEX ();
5616 int orig_minibuffer_auto_raise = minibuffer_auto_raise;
5617 int old_message_p = 0;
5618
5619 if (max_specpdl_size < specpdl_size + 40)
5620 max_specpdl_size = specpdl_size + 40;
5621
5622 if (minibuf_level)
5623 no_message = Qt;
5624
5625 if (NILP (no_message))
5626 {
5627 old_message_p = push_message ();
5628 record_unwind_protect (pop_message_unwind, Qnil);
5629 }
5630
5631 /* Ordinarily don't quit within this function,
5632 but don't make it impossible to quit (in case we get hung in I/O). */
5633 oquit = Vquit_flag;
5634 Vquit_flag = Qnil;
5635
5636 /* No GCPRO needed, because (when it matters) all Lisp_Object variables
5637 point to non-strings reached from Vbuffer_alist. */
5638
5639 if (!NILP (Vrun_hooks))
5640 call1 (Vrun_hooks, intern ("auto-save-hook"));
5641
5642 if (STRINGP (Vauto_save_list_file_name))
5643 {
5644 Lisp_Object listfile;
5645
5646 listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
5647
5648 /* Don't try to create the directory when shutting down Emacs,
5649 because creating the directory might signal an error, and
5650 that would leave Emacs in a strange state. */
5651 if (!NILP (Vrun_hooks))
5652 {
5653 Lisp_Object dir;
5654 dir = Ffile_name_directory (listfile);
5655 if (NILP (Ffile_directory_p (dir)))
5656 internal_condition_case_1 (do_auto_save_make_dir,
5657 dir, Fcons (Fcons (Qfile_error, Qnil), Qnil),
5658 do_auto_save_eh);
5659 }
5660
5661 stream = fopen (SDATA (listfile), "w");
5662 if (stream != NULL)
5663 {
5664 /* Arrange to close that file whether or not we get an error.
5665 Also reset auto_saving to 0. */
5666 lispstream = Fcons (Qnil, Qnil);
5667 XSETCARFASTINT (lispstream, (EMACS_UINT)stream >> 16);
5668 XSETCDRFASTINT (lispstream, (EMACS_UINT)stream & 0xffff);
5669 }
5670 else
5671 lispstream = Qnil;
5672 }
5673 else
5674 {
5675 stream = NULL;
5676 lispstream = Qnil;
5677 }
5678
5679 record_unwind_protect (do_auto_save_unwind, lispstream);
5680 record_unwind_protect (do_auto_save_unwind_1,
5681 make_number (minibuffer_auto_raise));
5682 minibuffer_auto_raise = 0;
5683 auto_saving = 1;
5684
5685 /* First, save all files which don't have handlers. If Emacs is
5686 crashing, the handlers may tweak what is causing Emacs to crash
5687 in the first place, and it would be a shame if Emacs failed to
5688 autosave perfectly ordinary files because it couldn't handle some
5689 ange-ftp'd file. */
5690 for (do_handled_files = 0; do_handled_files < 2; do_handled_files++)
5691 for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCDR (tail))
5692 {
5693 buf = XCDR (XCAR (tail));
5694 b = XBUFFER (buf);
5695
5696 /* Record all the buffers that have auto save mode
5697 in the special file that lists them. For each of these buffers,
5698 Record visited name (if any) and auto save name. */
5699 if (STRINGP (b->auto_save_file_name)
5700 && stream != NULL && do_handled_files == 0)
5701 {
5702 if (!NILP (b->filename))
5703 {
5704 fwrite (SDATA (b->filename), 1,
5705 SBYTES (b->filename), stream);
5706 }
5707 putc ('\n', stream);
5708 fwrite (SDATA (b->auto_save_file_name), 1,
5709 SBYTES (b->auto_save_file_name), stream);
5710 putc ('\n', stream);
5711 }
5712
5713 if (!NILP (current_only)
5714 && b != current_buffer)
5715 continue;
5716
5717 /* Don't auto-save indirect buffers.
5718 The base buffer takes care of it. */
5719 if (b->base_buffer)
5720 continue;
5721
5722 /* Check for auto save enabled
5723 and file changed since last auto save
5724 and file changed since last real save. */
5725 if (STRINGP (b->auto_save_file_name)
5726 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
5727 && b->auto_save_modified < BUF_MODIFF (b)
5728 /* -1 means we've turned off autosaving for a while--see below. */
5729 && XINT (b->save_length) >= 0
5730 && (do_handled_files
5731 || NILP (Ffind_file_name_handler (b->auto_save_file_name,
5732 Qwrite_region))))
5733 {
5734 EMACS_TIME before_time, after_time;
5735
5736 EMACS_GET_TIME (before_time);
5737
5738 /* If we had a failure, don't try again for 20 minutes. */
5739 if (b->auto_save_failure_time >= 0
5740 && EMACS_SECS (before_time) - b->auto_save_failure_time < 1200)
5741 continue;
5742
5743 if ((XFASTINT (b->save_length) * 10
5744 > (BUF_Z (b) - BUF_BEG (b)) * 13)
5745 /* A short file is likely to change a large fraction;
5746 spare the user annoying messages. */
5747 && XFASTINT (b->save_length) > 5000
5748 /* These messages are frequent and annoying for `*mail*'. */
5749 && !EQ (b->filename, Qnil)
5750 && NILP (no_message))
5751 {
5752 /* It has shrunk too much; turn off auto-saving here. */
5753 minibuffer_auto_raise = orig_minibuffer_auto_raise;
5754 message_with_string ("Buffer %s has shrunk a lot; auto save disabled in that buffer until next real save",
5755 b->name, 1);
5756 minibuffer_auto_raise = 0;
5757 /* Turn off auto-saving until there's a real save,
5758 and prevent any more warnings. */
5759 XSETINT (b->save_length, -1);
5760 Fsleep_for (make_number (1), Qnil);
5761 continue;
5762 }
5763 set_buffer_internal (b);
5764 if (!auto_saved && NILP (no_message))
5765 message1 ("Auto-saving...");
5766 internal_condition_case (auto_save_1, Qt, auto_save_error);
5767 auto_saved++;
5768 b->auto_save_modified = BUF_MODIFF (b);
5769 XSETFASTINT (current_buffer->save_length, Z - BEG);
5770 set_buffer_internal (old);
5771
5772 EMACS_GET_TIME (after_time);
5773
5774 /* If auto-save took more than 60 seconds,
5775 assume it was an NFS failure that got a timeout. */
5776 if (EMACS_SECS (after_time) - EMACS_SECS (before_time) > 60)
5777 b->auto_save_failure_time = EMACS_SECS (after_time);
5778 }
5779 }
5780
5781 /* Prevent another auto save till enough input events come in. */
5782 record_auto_save ();
5783
5784 if (auto_saved && NILP (no_message))
5785 {
5786 if (old_message_p)
5787 {
5788 /* If we are going to restore an old message,
5789 give time to read ours. */
5790 sit_for (1, 0, 0, 0, 0);
5791 restore_message ();
5792 }
5793 else
5794 /* If we displayed a message and then restored a state
5795 with no message, leave a "done" message on the screen. */
5796 message1 ("Auto-saving...done");
5797 }
5798
5799 Vquit_flag = oquit;
5800
5801 /* This restores the message-stack status. */
5802 unbind_to (count, Qnil);
5803 return Qnil;
5804 }
5805
5806 DEFUN ("set-buffer-auto-saved", Fset_buffer_auto_saved,
5807 Sset_buffer_auto_saved, 0, 0, 0,
5808 doc: /* Mark current buffer as auto-saved with its current text.
5809 No auto-save file will be written until the buffer changes again. */)
5810 ()
5811 {
5812 current_buffer->auto_save_modified = MODIFF;
5813 XSETFASTINT (current_buffer->save_length, Z - BEG);
5814 current_buffer->auto_save_failure_time = -1;
5815 return Qnil;
5816 }
5817
5818 DEFUN ("clear-buffer-auto-save-failure", Fclear_buffer_auto_save_failure,
5819 Sclear_buffer_auto_save_failure, 0, 0, 0,
5820 doc: /* Clear any record of a recent auto-save failure in the current buffer. */)
5821 ()
5822 {
5823 current_buffer->auto_save_failure_time = -1;
5824 return Qnil;
5825 }
5826
5827 DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p,
5828 0, 0, 0,
5829 doc: /* Return t if buffer has been auto-saved since last read in or saved. */)
5830 ()
5831 {
5832 return (SAVE_MODIFF < current_buffer->auto_save_modified) ? Qt : Qnil;
5833 }
5834 \f
5835 /* Reading and completing file names */
5836 extern Lisp_Object Ffile_name_completion (), Ffile_name_all_completions ();
5837
5838 /* In the string VAL, change each $ to $$ and return the result. */
5839
5840 static Lisp_Object
5841 double_dollars (val)
5842 Lisp_Object val;
5843 {
5844 register const unsigned char *old;
5845 register unsigned char *new;
5846 register int n;
5847 int osize, count;
5848
5849 osize = SBYTES (val);
5850
5851 /* Count the number of $ characters. */
5852 for (n = osize, count = 0, old = SDATA (val); n > 0; n--)
5853 if (*old++ == '$') count++;
5854 if (count > 0)
5855 {
5856 old = SDATA (val);
5857 val = make_uninit_multibyte_string (SCHARS (val) + count,
5858 osize + count);
5859 new = SDATA (val);
5860 for (n = osize; n > 0; n--)
5861 if (*old != '$')
5862 *new++ = *old++;
5863 else
5864 {
5865 *new++ = '$';
5866 *new++ = '$';
5867 old++;
5868 }
5869 }
5870 return val;
5871 }
5872
5873 static Lisp_Object
5874 read_file_name_cleanup (arg)
5875 Lisp_Object arg;
5876 {
5877 return (current_buffer->directory = arg);
5878 }
5879
5880 DEFUN ("read-file-name-internal", Fread_file_name_internal, Sread_file_name_internal,
5881 3, 3, 0,
5882 doc: /* Internal subroutine for read-file-name. Do not call this. */)
5883 (string, dir, action)
5884 Lisp_Object string, dir, action;
5885 /* action is nil for complete, t for return list of completions,
5886 lambda for verify final value */
5887 {
5888 Lisp_Object name, specdir, realdir, val, orig_string;
5889 int changed;
5890 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
5891
5892 CHECK_STRING (string);
5893
5894 realdir = dir;
5895 name = string;
5896 orig_string = Qnil;
5897 specdir = Qnil;
5898 changed = 0;
5899 /* No need to protect ACTION--we only compare it with t and nil. */
5900 GCPRO5 (string, realdir, name, specdir, orig_string);
5901
5902 if (SCHARS (string) == 0)
5903 {
5904 if (EQ (action, Qlambda))
5905 {
5906 UNGCPRO;
5907 return Qnil;
5908 }
5909 }
5910 else
5911 {
5912 orig_string = string;
5913 string = Fsubstitute_in_file_name (string);
5914 changed = NILP (Fstring_equal (string, orig_string));
5915 name = Ffile_name_nondirectory (string);
5916 val = Ffile_name_directory (string);
5917 if (! NILP (val))
5918 realdir = Fexpand_file_name (val, realdir);
5919 }
5920
5921 if (NILP (action))
5922 {
5923 specdir = Ffile_name_directory (string);
5924 val = Ffile_name_completion (name, realdir);
5925 UNGCPRO;
5926 if (!STRINGP (val))
5927 {
5928 if (changed)
5929 return double_dollars (string);
5930 return val;
5931 }
5932
5933 if (!NILP (specdir))
5934 val = concat2 (specdir, val);
5935 #ifndef VMS
5936 return double_dollars (val);
5937 #else /* not VMS */
5938 return val;
5939 #endif /* not VMS */
5940 }
5941 UNGCPRO;
5942
5943 if (EQ (action, Qt))
5944 {
5945 Lisp_Object all = Ffile_name_all_completions (name, realdir);
5946 Lisp_Object comp;
5947 int count;
5948
5949 if (NILP (Vread_file_name_predicate)
5950 || EQ (Vread_file_name_predicate, Qfile_exists_p))
5951 return all;
5952
5953 #ifndef VMS
5954 if (EQ (Vread_file_name_predicate, Qfile_directory_p))
5955 {
5956 /* Brute-force speed up for directory checking:
5957 Discard strings which don't end in a slash. */
5958 for (comp = Qnil; CONSP (all); all = XCDR (all))
5959 {
5960 Lisp_Object tem = XCAR (all);
5961 int len;
5962 if (STRINGP (tem) &&
5963 (len = SCHARS (tem), len > 0) &&
5964 IS_DIRECTORY_SEP (SREF (tem, len-1)))
5965 comp = Fcons (tem, comp);
5966 }
5967 }
5968 else
5969 #endif
5970 {
5971 /* Must do it the hard (and slow) way. */
5972 GCPRO3 (all, comp, specdir);
5973 count = SPECPDL_INDEX ();
5974 record_unwind_protect (read_file_name_cleanup, current_buffer->directory);
5975 current_buffer->directory = realdir;
5976 for (comp = Qnil; CONSP (all); all = XCDR (all))
5977 if (!NILP (call1 (Vread_file_name_predicate, XCAR (all))))
5978 comp = Fcons (XCAR (all), comp);
5979 unbind_to (count, Qnil);
5980 UNGCPRO;
5981 }
5982 return Fnreverse (comp);
5983 }
5984
5985 /* Only other case actually used is ACTION = lambda */
5986 #ifdef VMS
5987 /* Supposedly this helps commands such as `cd' that read directory names,
5988 but can someone explain how it helps them? -- RMS */
5989 if (SCHARS (name) == 0)
5990 return Qt;
5991 #endif /* VMS */
5992 if (!NILP (Vread_file_name_predicate))
5993 return call1 (Vread_file_name_predicate, string);
5994 return Ffile_exists_p (string);
5995 }
5996
5997 DEFUN ("read-file-name", Fread_file_name, Sread_file_name, 1, 6, 0,
5998 doc: /* Read file name, prompting with PROMPT and completing in directory DIR.
5999 Value is not expanded---you must call `expand-file-name' yourself.
6000 Default name to DEFAULT-FILENAME if user enters a null string.
6001 (If DEFAULT-FILENAME is omitted, the visited file name is used,
6002 except that if INITIAL is specified, that combined with DIR is used.)
6003 Fourth arg MUSTMATCH non-nil means require existing file's name.
6004 Non-nil and non-t means also require confirmation after completion.
6005 Fifth arg INITIAL specifies text to start with.
6006 If optional sixth arg PREDICATE is non-nil, possible completions and the
6007 resulting file name must satisfy (funcall PREDICATE NAME).
6008 DIR defaults to current buffer's directory default.
6009
6010 If this command was invoked with the mouse, use a file dialog box if
6011 `use-dialog-box' is non-nil, and the window system or X toolkit in use
6012 provides a file dialog box. */)
6013 (prompt, dir, default_filename, mustmatch, initial, predicate)
6014 Lisp_Object prompt, dir, default_filename, mustmatch, initial, predicate;
6015 {
6016 Lisp_Object val, insdef, tem;
6017 struct gcpro gcpro1, gcpro2;
6018 register char *homedir;
6019 int replace_in_history = 0;
6020 int add_to_history = 0;
6021 int count;
6022
6023 if (NILP (dir))
6024 dir = current_buffer->directory;
6025 if (NILP (default_filename))
6026 default_filename = !NILP (initial)
6027 ? Fexpand_file_name (initial, dir)
6028 : current_buffer->filename;
6029
6030 /* If dir starts with user's homedir, change that to ~. */
6031 homedir = (char *) egetenv ("HOME");
6032 #ifdef DOS_NT
6033 /* homedir can be NULL in temacs, since Vprocess_environment is not
6034 yet set up. We shouldn't crash in that case. */
6035 if (homedir != 0)
6036 {
6037 homedir = strcpy (alloca (strlen (homedir) + 1), homedir);
6038 CORRECT_DIR_SEPS (homedir);
6039 }
6040 #endif
6041 if (homedir != 0
6042 && STRINGP (dir)
6043 && !strncmp (homedir, SDATA (dir), strlen (homedir))
6044 && IS_DIRECTORY_SEP (SREF (dir, strlen (homedir))))
6045 {
6046 dir = make_string (SDATA (dir) + strlen (homedir) - 1,
6047 SBYTES (dir) - strlen (homedir) + 1);
6048 SSET (dir, 0, '~');
6049 }
6050 /* Likewise for default_filename. */
6051 if (homedir != 0
6052 && STRINGP (default_filename)
6053 && !strncmp (homedir, SDATA (default_filename), strlen (homedir))
6054 && IS_DIRECTORY_SEP (SREF (default_filename, strlen (homedir))))
6055 {
6056 default_filename
6057 = make_string (SDATA (default_filename) + strlen (homedir) - 1,
6058 SBYTES (default_filename) - strlen (homedir) + 1);
6059 SSET (default_filename, 0, '~');
6060 }
6061 if (!NILP (default_filename))
6062 {
6063 CHECK_STRING (default_filename);
6064 default_filename = double_dollars (default_filename);
6065 }
6066
6067 if (insert_default_directory && STRINGP (dir))
6068 {
6069 insdef = dir;
6070 if (!NILP (initial))
6071 {
6072 Lisp_Object args[2], pos;
6073
6074 args[0] = insdef;
6075 args[1] = initial;
6076 insdef = Fconcat (2, args);
6077 pos = make_number (SCHARS (double_dollars (dir)));
6078 insdef = Fcons (double_dollars (insdef), pos);
6079 }
6080 else
6081 insdef = double_dollars (insdef);
6082 }
6083 else if (STRINGP (initial))
6084 insdef = Fcons (double_dollars (initial), make_number (0));
6085 else
6086 insdef = Qnil;
6087
6088 if (!NILP (Vread_file_name_function))
6089 {
6090 Lisp_Object args[7];
6091
6092 GCPRO2 (insdef, default_filename);
6093 args[0] = Vread_file_name_function;
6094 args[1] = prompt;
6095 args[2] = dir;
6096 args[3] = default_filename;
6097 args[4] = mustmatch;
6098 args[5] = initial;
6099 args[6] = predicate;
6100 RETURN_UNGCPRO (Ffuncall (7, args));
6101 }
6102
6103 count = SPECPDL_INDEX ();
6104 #ifdef VMS
6105 specbind (intern ("completion-ignore-case"), Qt);
6106 #endif
6107
6108 specbind (intern ("minibuffer-completing-file-name"), Qt);
6109 specbind (intern ("read-file-name-predicate"),
6110 (NILP (predicate) ? Qfile_exists_p : predicate));
6111
6112 GCPRO2 (insdef, default_filename);
6113
6114 #if defined (USE_MOTIF) || defined (HAVE_NTGUI)
6115 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
6116 && use_dialog_box
6117 && have_menus_p ())
6118 {
6119 /* If DIR contains a file name, split it. */
6120 Lisp_Object file;
6121 file = Ffile_name_nondirectory (dir);
6122 if (SCHARS (file) && NILP (default_filename))
6123 {
6124 default_filename = file;
6125 dir = Ffile_name_directory (dir);
6126 }
6127 if (!NILP(default_filename))
6128 default_filename = Fexpand_file_name (default_filename, dir);
6129 val = Fx_file_dialog (prompt, dir, default_filename, mustmatch);
6130 add_to_history = 1;
6131 }
6132 else
6133 #endif
6134 val = Fcompleting_read (prompt, intern ("read-file-name-internal"),
6135 dir, mustmatch, insdef,
6136 Qfile_name_history, default_filename, Qnil);
6137
6138 tem = Fsymbol_value (Qfile_name_history);
6139 if (CONSP (tem) && EQ (XCAR (tem), val))
6140 replace_in_history = 1;
6141
6142 /* If Fcompleting_read returned the inserted default string itself
6143 (rather than a new string with the same contents),
6144 it has to mean that the user typed RET with the minibuffer empty.
6145 In that case, we really want to return ""
6146 so that commands such as set-visited-file-name can distinguish. */
6147 if (EQ (val, default_filename))
6148 {
6149 /* In this case, Fcompleting_read has not added an element
6150 to the history. Maybe we should. */
6151 if (! replace_in_history)
6152 add_to_history = 1;
6153
6154 val = empty_string;
6155 }
6156
6157 unbind_to (count, Qnil);
6158 UNGCPRO;
6159 if (NILP (val))
6160 error ("No file name specified");
6161
6162 tem = Fstring_equal (val, CONSP (insdef) ? XCAR (insdef) : insdef);
6163
6164 if (!NILP (tem) && !NILP (default_filename))
6165 val = default_filename;
6166 else if (SCHARS (val) == 0 && NILP (insdef))
6167 {
6168 if (!NILP (default_filename))
6169 val = default_filename;
6170 else
6171 error ("No default file name");
6172 }
6173 val = Fsubstitute_in_file_name (val);
6174
6175 if (replace_in_history)
6176 /* Replace what Fcompleting_read added to the history
6177 with what we will actually return. */
6178 XSETCAR (Fsymbol_value (Qfile_name_history), double_dollars (val));
6179 else if (add_to_history)
6180 {
6181 /* Add the value to the history--but not if it matches
6182 the last value already there. */
6183 Lisp_Object val1 = double_dollars (val);
6184 tem = Fsymbol_value (Qfile_name_history);
6185 if (! CONSP (tem) || NILP (Fequal (XCAR (tem), val1)))
6186 Fset (Qfile_name_history,
6187 Fcons (val1, tem));
6188 }
6189
6190 return val;
6191 }
6192
6193 \f
6194 void
6195 init_fileio_once ()
6196 {
6197 /* Must be set before any path manipulation is performed. */
6198 XSETFASTINT (Vdirectory_sep_char, '/');
6199 }
6200
6201 \f
6202 void
6203 syms_of_fileio ()
6204 {
6205 Qexpand_file_name = intern ("expand-file-name");
6206 Qsubstitute_in_file_name = intern ("substitute-in-file-name");
6207 Qdirectory_file_name = intern ("directory-file-name");
6208 Qfile_name_directory = intern ("file-name-directory");
6209 Qfile_name_nondirectory = intern ("file-name-nondirectory");
6210 Qunhandled_file_name_directory = intern ("unhandled-file-name-directory");
6211 Qfile_name_as_directory = intern ("file-name-as-directory");
6212 Qcopy_file = intern ("copy-file");
6213 Qmake_directory_internal = intern ("make-directory-internal");
6214 Qmake_directory = intern ("make-directory");
6215 Qdelete_directory = intern ("delete-directory");
6216 Qdelete_file = intern ("delete-file");
6217 Qrename_file = intern ("rename-file");
6218 Qadd_name_to_file = intern ("add-name-to-file");
6219 Qmake_symbolic_link = intern ("make-symbolic-link");
6220 Qfile_exists_p = intern ("file-exists-p");
6221 Qfile_executable_p = intern ("file-executable-p");
6222 Qfile_readable_p = intern ("file-readable-p");
6223 Qfile_writable_p = intern ("file-writable-p");
6224 Qfile_symlink_p = intern ("file-symlink-p");
6225 Qaccess_file = intern ("access-file");
6226 Qfile_directory_p = intern ("file-directory-p");
6227 Qfile_regular_p = intern ("file-regular-p");
6228 Qfile_accessible_directory_p = intern ("file-accessible-directory-p");
6229 Qfile_modes = intern ("file-modes");
6230 Qset_file_modes = intern ("set-file-modes");
6231 Qfile_newer_than_file_p = intern ("file-newer-than-file-p");
6232 Qinsert_file_contents = intern ("insert-file-contents");
6233 Qwrite_region = intern ("write-region");
6234 Qverify_visited_file_modtime = intern ("verify-visited-file-modtime");
6235 Qset_visited_file_modtime = intern ("set-visited-file-modtime");
6236
6237 staticpro (&Qexpand_file_name);
6238 staticpro (&Qsubstitute_in_file_name);
6239 staticpro (&Qdirectory_file_name);
6240 staticpro (&Qfile_name_directory);
6241 staticpro (&Qfile_name_nondirectory);
6242 staticpro (&Qunhandled_file_name_directory);
6243 staticpro (&Qfile_name_as_directory);
6244 staticpro (&Qcopy_file);
6245 staticpro (&Qmake_directory_internal);
6246 staticpro (&Qmake_directory);
6247 staticpro (&Qdelete_directory);
6248 staticpro (&Qdelete_file);
6249 staticpro (&Qrename_file);
6250 staticpro (&Qadd_name_to_file);
6251 staticpro (&Qmake_symbolic_link);
6252 staticpro (&Qfile_exists_p);
6253 staticpro (&Qfile_executable_p);
6254 staticpro (&Qfile_readable_p);
6255 staticpro (&Qfile_writable_p);
6256 staticpro (&Qaccess_file);
6257 staticpro (&Qfile_symlink_p);
6258 staticpro (&Qfile_directory_p);
6259 staticpro (&Qfile_regular_p);
6260 staticpro (&Qfile_accessible_directory_p);
6261 staticpro (&Qfile_modes);
6262 staticpro (&Qset_file_modes);
6263 staticpro (&Qfile_newer_than_file_p);
6264 staticpro (&Qinsert_file_contents);
6265 staticpro (&Qwrite_region);
6266 staticpro (&Qverify_visited_file_modtime);
6267 staticpro (&Qset_visited_file_modtime);
6268
6269 Qfile_name_history = intern ("file-name-history");
6270 Fset (Qfile_name_history, Qnil);
6271 staticpro (&Qfile_name_history);
6272
6273 Qfile_error = intern ("file-error");
6274 staticpro (&Qfile_error);
6275 Qfile_already_exists = intern ("file-already-exists");
6276 staticpro (&Qfile_already_exists);
6277 Qfile_date_error = intern ("file-date-error");
6278 staticpro (&Qfile_date_error);
6279 Qexcl = intern ("excl");
6280 staticpro (&Qexcl);
6281
6282 #ifdef DOS_NT
6283 Qfind_buffer_file_type = intern ("find-buffer-file-type");
6284 staticpro (&Qfind_buffer_file_type);
6285 #endif /* DOS_NT */
6286
6287 DEFVAR_LISP ("file-name-coding-system", &Vfile_name_coding_system,
6288 doc: /* *Coding system for encoding file names.
6289 If it is nil, `default-file-name-coding-system' (which see) is used. */);
6290 Vfile_name_coding_system = Qnil;
6291
6292 DEFVAR_LISP ("default-file-name-coding-system",
6293 &Vdefault_file_name_coding_system,
6294 doc: /* Default coding system for encoding file names.
6295 This variable is used only when `file-name-coding-system' is nil.
6296
6297 This variable is set/changed by the command `set-language-environment'.
6298 User should not set this variable manually,
6299 instead use `file-name-coding-system' to get a constant encoding
6300 of file names regardless of the current language environment. */);
6301 Vdefault_file_name_coding_system = Qnil;
6302
6303 DEFVAR_LISP ("auto-save-file-format", &Vauto_save_file_format,
6304 doc: /* *Format in which to write auto-save files.
6305 Should be a list of symbols naming formats that are defined in `format-alist'.
6306 If it is t, which is the default, auto-save files are written in the
6307 same format as a regular save would use. */);
6308 Vauto_save_file_format = Qt;
6309
6310 Qformat_decode = intern ("format-decode");
6311 staticpro (&Qformat_decode);
6312 Qformat_annotate_function = intern ("format-annotate-function");
6313 staticpro (&Qformat_annotate_function);
6314
6315 Qcar_less_than_car = intern ("car-less-than-car");
6316 staticpro (&Qcar_less_than_car);
6317
6318 Fput (Qfile_error, Qerror_conditions,
6319 Fcons (Qfile_error, Fcons (Qerror, Qnil)));
6320 Fput (Qfile_error, Qerror_message,
6321 build_string ("File error"));
6322
6323 Fput (Qfile_already_exists, Qerror_conditions,
6324 Fcons (Qfile_already_exists,
6325 Fcons (Qfile_error, Fcons (Qerror, Qnil))));
6326 Fput (Qfile_already_exists, Qerror_message,
6327 build_string ("File already exists"));
6328
6329 Fput (Qfile_date_error, Qerror_conditions,
6330 Fcons (Qfile_date_error,
6331 Fcons (Qfile_error, Fcons (Qerror, Qnil))));
6332 Fput (Qfile_date_error, Qerror_message,
6333 build_string ("Cannot set file date"));
6334
6335 DEFVAR_LISP ("read-file-name-function", &Vread_file_name_function,
6336 doc: /* If this is non-nil, `read-file-name' does its work by calling this function. */);
6337 Vread_file_name_function = Qnil;
6338
6339 DEFVAR_LISP ("read-file-name-predicate", &Vread_file_name_predicate,
6340 doc: /* Current predicate used by `read-file-name-internal'. */);
6341 Vread_file_name_predicate = Qnil;
6342
6343 DEFVAR_BOOL ("insert-default-directory", &insert_default_directory,
6344 doc: /* *Non-nil means when reading a filename start with default dir in minibuffer. */);
6345 insert_default_directory = 1;
6346
6347 DEFVAR_BOOL ("vms-stmlf-recfm", &vms_stmlf_recfm,
6348 doc: /* *Non-nil means write new files with record format `stmlf'.
6349 nil means use format `var'. This variable is meaningful only on VMS. */);
6350 vms_stmlf_recfm = 0;
6351
6352 DEFVAR_LISP ("directory-sep-char", &Vdirectory_sep_char,
6353 doc: /* Directory separator character for built-in functions that return file names.
6354 The value should be either ?/ or ?\\ (any other value is treated as ?\\).
6355 This variable affects the built-in functions only on Windows,
6356 on other platforms, it is initialized so that Lisp code can find out
6357 what the normal separator is. */);
6358
6359 DEFVAR_LISP ("file-name-handler-alist", &Vfile_name_handler_alist,
6360 doc: /* *Alist of elements (REGEXP . HANDLER) for file names handled specially.
6361 If a file name matches REGEXP, then all I/O on that file is done by calling
6362 HANDLER.
6363
6364 The first argument given to HANDLER is the name of the I/O primitive
6365 to be handled; the remaining arguments are the arguments that were
6366 passed to that primitive. For example, if you do
6367 (file-exists-p FILENAME)
6368 and FILENAME is handled by HANDLER, then HANDLER is called like this:
6369 (funcall HANDLER 'file-exists-p FILENAME)
6370 The function `find-file-name-handler' checks this list for a handler
6371 for its argument. */);
6372 Vfile_name_handler_alist = Qnil;
6373
6374 DEFVAR_LISP ("set-auto-coding-function",
6375 &Vset_auto_coding_function,
6376 doc: /* If non-nil, a function to call to decide a coding system of file.
6377 Two arguments are passed to this function: the file name
6378 and the length of a file contents following the point.
6379 This function should return a coding system to decode the file contents.
6380 It should check the file name against `auto-coding-alist'.
6381 If no coding system is decided, it should check a coding system
6382 specified in the heading lines with the format:
6383 -*- ... coding: CODING-SYSTEM; ... -*-
6384 or local variable spec of the tailing lines with `coding:' tag. */);
6385 Vset_auto_coding_function = Qnil;
6386
6387 DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions,
6388 doc: /* A list of functions to be called at the end of `insert-file-contents'.
6389 Each is passed one argument, the number of bytes inserted. It should return
6390 the new byte count, and leave point the same. If `insert-file-contents' is
6391 intercepted by a handler from `file-name-handler-alist', that handler is
6392 responsible for calling the after-insert-file-functions if appropriate. */);
6393 Vafter_insert_file_functions = Qnil;
6394
6395 DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions,
6396 doc: /* A list of functions to be called at the start of `write-region'.
6397 Each is passed two arguments, START and END as for `write-region'.
6398 These are usually two numbers but not always; see the documentation
6399 for `write-region'. The function should return a list of pairs
6400 of the form (POSITION . STRING), consisting of strings to be effectively
6401 inserted at the specified positions of the file being written (1 means to
6402 insert before the first byte written). The POSITIONs must be sorted into
6403 increasing order. If there are several functions in the list, the several
6404 lists are merged destructively. Alternatively, the function can return
6405 with a different buffer current and value nil.*/);
6406 Vwrite_region_annotate_functions = Qnil;
6407
6408 DEFVAR_LISP ("write-region-annotations-so-far",
6409 &Vwrite_region_annotations_so_far,
6410 doc: /* When an annotation function is called, this holds the previous annotations.
6411 These are the annotations made by other annotation functions
6412 that were already called. See also `write-region-annotate-functions'. */);
6413 Vwrite_region_annotations_so_far = Qnil;
6414
6415 DEFVAR_LISP ("inhibit-file-name-handlers", &Vinhibit_file_name_handlers,
6416 doc: /* A list of file name handlers that temporarily should not be used.
6417 This applies only to the operation `inhibit-file-name-operation'. */);
6418 Vinhibit_file_name_handlers = Qnil;
6419
6420 DEFVAR_LISP ("inhibit-file-name-operation", &Vinhibit_file_name_operation,
6421 doc: /* The operation for which `inhibit-file-name-handlers' is applicable. */);
6422 Vinhibit_file_name_operation = Qnil;
6423
6424 DEFVAR_LISP ("auto-save-list-file-name", &Vauto_save_list_file_name,
6425 doc: /* File name in which we write a list of all auto save file names.
6426 This variable is initialized automatically from `auto-save-list-file-prefix'
6427 shortly after Emacs reads your `.emacs' file, if you have not yet given it
6428 a non-nil value. */);
6429 Vauto_save_list_file_name = Qnil;
6430
6431 defsubr (&Sfind_file_name_handler);
6432 defsubr (&Sfile_name_directory);
6433 defsubr (&Sfile_name_nondirectory);
6434 defsubr (&Sunhandled_file_name_directory);
6435 defsubr (&Sfile_name_as_directory);
6436 defsubr (&Sdirectory_file_name);
6437 defsubr (&Smake_temp_name);
6438 defsubr (&Sexpand_file_name);
6439 defsubr (&Ssubstitute_in_file_name);
6440 defsubr (&Scopy_file);
6441 defsubr (&Smake_directory_internal);
6442 defsubr (&Sdelete_directory);
6443 defsubr (&Sdelete_file);
6444 defsubr (&Srename_file);
6445 defsubr (&Sadd_name_to_file);
6446 #ifdef S_IFLNK
6447 defsubr (&Smake_symbolic_link);
6448 #endif /* S_IFLNK */
6449 #ifdef VMS
6450 defsubr (&Sdefine_logical_name);
6451 #endif /* VMS */
6452 #ifdef HPUX_NET
6453 defsubr (&Ssysnetunam);
6454 #endif /* HPUX_NET */
6455 defsubr (&Sfile_name_absolute_p);
6456 defsubr (&Sfile_exists_p);
6457 defsubr (&Sfile_executable_p);
6458 defsubr (&Sfile_readable_p);
6459 defsubr (&Sfile_writable_p);
6460 defsubr (&Saccess_file);
6461 defsubr (&Sfile_symlink_p);
6462 defsubr (&Sfile_directory_p);
6463 defsubr (&Sfile_accessible_directory_p);
6464 defsubr (&Sfile_regular_p);
6465 defsubr (&Sfile_modes);
6466 defsubr (&Sset_file_modes);
6467 defsubr (&Sset_default_file_modes);
6468 defsubr (&Sdefault_file_modes);
6469 defsubr (&Sfile_newer_than_file_p);
6470 defsubr (&Sinsert_file_contents);
6471 defsubr (&Swrite_region);
6472 defsubr (&Scar_less_than_car);
6473 defsubr (&Sverify_visited_file_modtime);
6474 defsubr (&Sclear_visited_file_modtime);
6475 defsubr (&Svisited_file_modtime);
6476 defsubr (&Sset_visited_file_modtime);
6477 defsubr (&Sdo_auto_save);
6478 defsubr (&Sset_buffer_auto_saved);
6479 defsubr (&Sclear_buffer_auto_save_failure);
6480 defsubr (&Srecent_auto_save_p);
6481
6482 defsubr (&Sread_file_name_internal);
6483 defsubr (&Sread_file_name);
6484
6485 #ifdef unix
6486 defsubr (&Sunix_sync);
6487 #endif
6488 }
6489