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