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