Merge from trunk.
[emacs.git] / src / dired.c
blobaec64f94379c798795084bf22b2f9774c5ecccae
1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
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 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
23 #include <stdio.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <setjmp.h>
28 #ifdef HAVE_PWD_H
29 #include <pwd.h>
30 #endif
31 #include <grp.h>
33 #include <errno.h>
35 #ifdef HAVE_UNISTD_H
36 #include <unistd.h>
37 #endif
39 /* The d_nameln member of a struct dirent includes the '\0' character
40 on some systems, but not on others. What's worse, you can't tell
41 at compile-time which one it will be, since it really depends on
42 the sort of system providing the filesystem you're reading from,
43 not the system you are running on. Paul Eggert
44 <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
45 SunOS 4.1.2 host, reading a directory that is remote-mounted from a
46 Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
48 Since applying strlen to the name always works, we'll just do that. */
49 #define NAMLEN(p) strlen (p->d_name)
51 #ifdef SYSV_SYSTEM_DIR
53 #include <dirent.h>
54 #define DIRENTRY struct dirent
56 #else /* not SYSV_SYSTEM_DIR */
58 #ifdef MSDOS
59 #include <dirent.h>
60 #else
61 #include <sys/dir.h>
62 #endif
64 #include <sys/stat.h>
66 #ifndef MSDOS
67 #define DIRENTRY struct direct
69 extern DIR *opendir (char *);
70 extern struct direct *readdir (DIR *);
72 #endif /* not MSDOS */
73 #endif /* not SYSV_SYSTEM_DIR */
75 /* Some versions of Cygwin don't have d_ino in `struct dirent'. */
76 #if defined(MSDOS) || defined(__CYGWIN__)
77 #define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
78 #else
79 #define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
80 #endif
82 #include "lisp.h"
83 #include "systime.h"
84 #include "buffer.h"
85 #include "commands.h"
86 #include "character.h"
87 #include "charset.h"
88 #include "coding.h"
89 #include "regex.h"
90 #include "blockinput.h"
92 /* Returns a search buffer, with a fastmap allocated and ready to go. */
93 extern struct re_pattern_buffer *compile_pattern (Lisp_Object, struct re_registers *, Lisp_Object, int, int);
95 /* From filemode.c. Can't go in Lisp.h because of `stat'. */
96 extern void filemodestring (struct stat *, char *);
98 /* if system does not have symbolic links, it does not have lstat.
99 In that case, use ordinary stat instead. */
101 #ifndef S_IFLNK
102 #define lstat stat
103 #endif
105 extern Lisp_Object Vw32_get_true_file_attributes;
107 Lisp_Object Vcompletion_ignored_extensions;
108 Lisp_Object Qdirectory_files;
109 Lisp_Object Qdirectory_files_and_attributes;
110 Lisp_Object Qfile_name_completion;
111 Lisp_Object Qfile_name_all_completions;
112 Lisp_Object Qfile_attributes;
113 Lisp_Object Qfile_attributes_lessp;
115 static int scmp (const unsigned char *, const unsigned char *, int);
117 #ifdef WINDOWSNT
118 Lisp_Object
119 directory_files_internal_w32_unwind (Lisp_Object arg)
121 Vw32_get_true_file_attributes = arg;
122 return Qnil;
124 #endif
126 Lisp_Object
127 directory_files_internal_unwind (Lisp_Object dh)
129 DIR *d = (DIR *) XSAVE_VALUE (dh)->pointer;
130 BLOCK_INPUT;
131 closedir (d);
132 UNBLOCK_INPUT;
133 return Qnil;
136 /* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
137 When ATTRS is zero, return a list of directory filenames; when
138 non-zero, return a list of directory filenames and their attributes.
139 In the latter case, ID_FORMAT is passed to Ffile_attributes. */
141 Lisp_Object
142 directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, int attrs, Lisp_Object id_format)
144 DIR *d;
145 int directory_nbytes;
146 Lisp_Object list, dirfilename, encoded_directory;
147 struct re_pattern_buffer *bufp = NULL;
148 int needsep = 0;
149 int count = SPECPDL_INDEX ();
150 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
151 DIRENTRY *dp;
152 #ifdef WINDOWSNT
153 Lisp_Object w32_save = Qnil;
154 #endif
156 /* Because of file name handlers, these functions might call
157 Ffuncall, and cause a GC. */
158 list = encoded_directory = dirfilename = Qnil;
159 GCPRO5 (match, directory, list, dirfilename, encoded_directory);
160 dirfilename = Fdirectory_file_name (directory);
162 if (!NILP (match))
164 CHECK_STRING (match);
166 /* MATCH might be a flawed regular expression. Rather than
167 catching and signaling our own errors, we just call
168 compile_pattern to do the work for us. */
169 /* Pass 1 for the MULTIBYTE arg
170 because we do make multibyte strings if the contents warrant. */
171 # ifdef WINDOWSNT
172 /* Windows users want case-insensitive wildcards. */
173 bufp = compile_pattern (match, 0,
174 buffer_defaults.case_canon_table, 0, 1);
175 # else /* !WINDOWSNT */
176 bufp = compile_pattern (match, 0, Qnil, 0, 1);
177 # endif /* !WINDOWSNT */
180 /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
181 run_pre_post_conversion_on_str which calls Lisp directly and
182 indirectly. */
183 if (STRING_MULTIBYTE (dirfilename))
184 dirfilename = ENCODE_FILE (dirfilename);
185 encoded_directory = (STRING_MULTIBYTE (directory)
186 ? ENCODE_FILE (directory) : directory);
188 /* Now *bufp is the compiled form of MATCH; don't call anything
189 which might compile a new regexp until we're done with the loop! */
191 BLOCK_INPUT;
192 d = opendir (SDATA (dirfilename));
193 UNBLOCK_INPUT;
194 if (d == NULL)
195 report_file_error ("Opening directory", Fcons (directory, Qnil));
197 /* Unfortunately, we can now invoke expand-file-name and
198 file-attributes on filenames, both of which can throw, so we must
199 do a proper unwind-protect. */
200 record_unwind_protect (directory_files_internal_unwind,
201 make_save_value (d, 0));
203 #ifdef WINDOWSNT
204 if (attrs)
206 extern int is_slow_fs (const char *);
208 /* Do this only once to avoid doing it (in w32.c:stat) for each
209 file in the directory, when we call Ffile_attributes below. */
210 record_unwind_protect (directory_files_internal_w32_unwind,
211 Vw32_get_true_file_attributes);
212 w32_save = Vw32_get_true_file_attributes;
213 if (EQ (Vw32_get_true_file_attributes, Qlocal))
215 /* w32.c:stat will notice these bindings and avoid calling
216 GetDriveType for each file. */
217 if (is_slow_fs (SDATA (dirfilename)))
218 Vw32_get_true_file_attributes = Qnil;
219 else
220 Vw32_get_true_file_attributes = Qt;
223 #endif
225 directory_nbytes = SBYTES (directory);
226 re_match_object = Qt;
228 /* Decide whether we need to add a directory separator. */
229 if (directory_nbytes == 0
230 || !IS_ANY_SEP (SREF (directory, directory_nbytes - 1)))
231 needsep = 1;
233 /* Loop reading blocks until EOF or error. */
234 for (;;)
236 errno = 0;
237 dp = readdir (d);
239 if (dp == NULL && (0
240 #ifdef EAGAIN
241 || errno == EAGAIN
242 #endif
243 #ifdef EINTR
244 || errno == EINTR
245 #endif
247 { QUIT; continue; }
249 if (dp == NULL)
250 break;
252 if (DIRENTRY_NONEMPTY (dp))
254 int len;
255 int wanted = 0;
256 Lisp_Object name, finalname;
257 struct gcpro gcpro1, gcpro2;
259 len = NAMLEN (dp);
260 name = finalname = make_unibyte_string (dp->d_name, len);
261 GCPRO2 (finalname, name);
263 /* Note: DECODE_FILE can GC; it should protect its argument,
264 though. */
265 name = DECODE_FILE (name);
266 len = SBYTES (name);
268 /* Now that we have unwind_protect in place, we might as well
269 allow matching to be interrupted. */
270 immediate_quit = 1;
271 QUIT;
273 if (NILP (match)
274 || (0 <= re_search (bufp, SDATA (name), len, 0, len, 0)))
275 wanted = 1;
277 immediate_quit = 0;
279 if (wanted)
281 if (!NILP (full))
283 Lisp_Object fullname;
284 int nbytes = len + directory_nbytes + needsep;
285 int nchars;
287 fullname = make_uninit_multibyte_string (nbytes, nbytes);
288 memcpy (SDATA (fullname), SDATA (directory),
289 directory_nbytes);
291 if (needsep)
292 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
294 memcpy (SDATA (fullname) + directory_nbytes + needsep,
295 SDATA (name), len);
297 nchars = chars_in_text (SDATA (fullname), nbytes);
299 /* Some bug somewhere. */
300 if (nchars > nbytes)
301 abort ();
303 STRING_SET_CHARS (fullname, nchars);
304 if (nchars == nbytes)
305 STRING_SET_UNIBYTE (fullname);
307 finalname = fullname;
309 else
310 finalname = name;
312 if (attrs)
314 /* Construct an expanded filename for the directory entry.
315 Use the decoded names for input to Ffile_attributes. */
316 Lisp_Object decoded_fullname, fileattrs;
317 struct gcpro gcpro1, gcpro2;
319 decoded_fullname = fileattrs = Qnil;
320 GCPRO2 (decoded_fullname, fileattrs);
322 /* Both Fexpand_file_name and Ffile_attributes can GC. */
323 decoded_fullname = Fexpand_file_name (name, directory);
324 fileattrs = Ffile_attributes (decoded_fullname, id_format);
326 list = Fcons (Fcons (finalname, fileattrs), list);
327 UNGCPRO;
329 else
330 list = Fcons (finalname, list);
333 UNGCPRO;
337 BLOCK_INPUT;
338 closedir (d);
339 UNBLOCK_INPUT;
340 #ifdef WINDOWSNT
341 if (attrs)
342 Vw32_get_true_file_attributes = w32_save;
343 #endif
345 /* Discard the unwind protect. */
346 specpdl_ptr = specpdl + count;
348 if (NILP (nosort))
349 list = Fsort (Fnreverse (list),
350 attrs ? Qfile_attributes_lessp : Qstring_lessp);
352 RETURN_UNGCPRO (list);
356 DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
357 doc: /* Return a list of names of files in DIRECTORY.
358 There are three optional arguments:
359 If FULL is non-nil, return absolute file names. Otherwise return names
360 that are relative to the specified directory.
361 If MATCH is non-nil, mention only file names that match the regexp MATCH.
362 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
363 Otherwise, the list returned is sorted with `string-lessp'.
364 NOSORT is useful if you plan to sort the result yourself. */)
365 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort)
367 Lisp_Object handler;
368 directory = Fexpand_file_name (directory, Qnil);
370 /* If the file name has special constructs in it,
371 call the corresponding file handler. */
372 handler = Ffind_file_name_handler (directory, Qdirectory_files);
373 if (!NILP (handler))
374 return call5 (handler, Qdirectory_files, directory,
375 full, match, nosort);
377 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
380 DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
381 Sdirectory_files_and_attributes, 1, 5, 0,
382 doc: /* Return a list of names of files and their attributes in DIRECTORY.
383 There are four optional arguments:
384 If FULL is non-nil, return absolute file names. Otherwise return names
385 that are relative to the specified directory.
386 If MATCH is non-nil, mention only file names that match the regexp MATCH.
387 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
388 NOSORT is useful if you plan to sort the result yourself.
389 ID-FORMAT specifies the preferred format of attributes uid and gid, see
390 `file-attributes' for further documentation.
391 On MS-Windows, performance depends on `w32-get-true-file-attributes',
392 which see. */)
393 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, Lisp_Object id_format)
395 Lisp_Object handler;
396 directory = Fexpand_file_name (directory, Qnil);
398 /* If the file name has special constructs in it,
399 call the corresponding file handler. */
400 handler = Ffind_file_name_handler (directory, Qdirectory_files_and_attributes);
401 if (!NILP (handler))
402 return call6 (handler, Qdirectory_files_and_attributes,
403 directory, full, match, nosort, id_format);
405 return directory_files_internal (directory, full, match, nosort, 1, id_format);
409 Lisp_Object file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate);
411 DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
412 2, 3, 0,
413 doc: /* Complete file name FILE in directory DIRECTORY.
414 Returns the longest string
415 common to all file names in DIRECTORY that start with FILE.
416 If there is only one and FILE matches it exactly, returns t.
417 Returns nil if DIRECTORY contains no name starting with FILE.
419 If PREDICATE is non-nil, call PREDICATE with each possible
420 completion (in absolute form) and ignore it if PREDICATE returns nil.
422 This function ignores some of the possible completions as
423 determined by the variable `completion-ignored-extensions', which see. */)
424 (Lisp_Object file, Lisp_Object directory, Lisp_Object predicate)
426 Lisp_Object handler;
428 /* If the directory name has special constructs in it,
429 call the corresponding file handler. */
430 handler = Ffind_file_name_handler (directory, Qfile_name_completion);
431 if (!NILP (handler))
432 return call4 (handler, Qfile_name_completion, file, directory, predicate);
434 /* If the file name has special constructs in it,
435 call the corresponding file handler. */
436 handler = Ffind_file_name_handler (file, Qfile_name_completion);
437 if (!NILP (handler))
438 return call4 (handler, Qfile_name_completion, file, directory, predicate);
440 return file_name_completion (file, directory, 0, 0, predicate);
443 DEFUN ("file-name-all-completions", Ffile_name_all_completions,
444 Sfile_name_all_completions, 2, 2, 0,
445 doc: /* Return a list of all completions of file name FILE in directory DIRECTORY.
446 These are all file names in directory DIRECTORY which begin with FILE. */)
447 (Lisp_Object file, Lisp_Object directory)
449 Lisp_Object handler;
451 /* If the directory name has special constructs in it,
452 call the corresponding file handler. */
453 handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
454 if (!NILP (handler))
455 return call3 (handler, Qfile_name_all_completions, file, directory);
457 /* If the file name has special constructs in it,
458 call the corresponding file handler. */
459 handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
460 if (!NILP (handler))
461 return call3 (handler, Qfile_name_all_completions, file, directory);
463 return file_name_completion (file, directory, 1, 0, Qnil);
466 static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
467 Lisp_Object Qdefault_directory;
469 Lisp_Object
470 file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate)
472 DIR *d;
473 int bestmatchsize = 0;
474 int matchcount = 0;
475 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
476 If ALL_FLAG is 0, BESTMATCH is either nil
477 or the best match so far, not decoded. */
478 Lisp_Object bestmatch, tem, elt, name;
479 Lisp_Object encoded_file;
480 Lisp_Object encoded_dir;
481 struct stat st;
482 int directoryp;
483 /* If includeall is zero, exclude files in completion-ignored-extensions as
484 well as "." and "..". Until shown otherwise, assume we can't exclude
485 anything. */
486 int includeall = 1;
487 int count = SPECPDL_INDEX ();
488 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
490 elt = Qnil;
492 CHECK_STRING (file);
494 #ifdef FILE_SYSTEM_CASE
495 file = FILE_SYSTEM_CASE (file);
496 #endif
497 bestmatch = Qnil;
498 encoded_file = encoded_dir = Qnil;
499 GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
500 dirname = Fexpand_file_name (dirname, Qnil);
501 specbind (Qdefault_directory, dirname);
503 /* Do completion on the encoded file name
504 because the other names in the directory are (we presume)
505 encoded likewise. We decode the completed string at the end. */
506 /* Actually, this is not quite true any more: we do most of the completion
507 work with decoded file names, but we still do some filtering based
508 on the encoded file name. */
509 encoded_file = STRING_MULTIBYTE (file) ? ENCODE_FILE (file) : file;
511 encoded_dir = ENCODE_FILE (dirname);
513 BLOCK_INPUT;
514 d = opendir (SDATA (Fdirectory_file_name (encoded_dir)));
515 UNBLOCK_INPUT;
516 if (!d)
517 report_file_error ("Opening directory", Fcons (dirname, Qnil));
519 record_unwind_protect (directory_files_internal_unwind,
520 make_save_value (d, 0));
522 /* Loop reading blocks */
523 /* (att3b compiler bug requires do a null comparison this way) */
524 while (1)
526 DIRENTRY *dp;
527 int len;
528 int canexclude = 0;
530 errno = 0;
531 dp = readdir (d);
532 if (dp == NULL && (0
533 # ifdef EAGAIN
534 || errno == EAGAIN
535 # endif
536 # ifdef EINTR
537 || errno == EINTR
538 # endif
540 { QUIT; continue; }
542 if (!dp) break;
544 len = NAMLEN (dp);
546 QUIT;
547 if (! DIRENTRY_NONEMPTY (dp)
548 || len < SCHARS (encoded_file)
549 || 0 <= scmp (dp->d_name, SDATA (encoded_file),
550 SCHARS (encoded_file)))
551 continue;
553 if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
554 continue;
556 directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
557 tem = Qnil;
558 /* If all_flag is set, always include all.
559 It would not actually be helpful to the user to ignore any possible
560 completions when making a list of them. */
561 if (!all_flag)
563 int skip;
565 #if 0 /* FIXME: The `scmp' call compares an encoded and a decoded string. */
566 /* If this entry matches the current bestmatch, the only
567 thing it can do is increase matchcount, so don't bother
568 investigating it any further. */
569 if (!completion_ignore_case
570 /* The return result depends on whether it's the sole match. */
571 && matchcount > 1
572 && !includeall /* This match may allow includeall to 0. */
573 && len >= bestmatchsize
574 && 0 > scmp (dp->d_name, SDATA (bestmatch), bestmatchsize))
575 continue;
576 #endif
578 if (directoryp)
580 #ifndef TRIVIAL_DIRECTORY_ENTRY
581 #define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
582 #endif
583 /* "." and ".." are never interesting as completions, and are
584 actually in the way in a directory with only one file. */
585 if (TRIVIAL_DIRECTORY_ENTRY (dp->d_name))
586 canexclude = 1;
587 else if (len > SCHARS (encoded_file))
588 /* Ignore directories if they match an element of
589 completion-ignored-extensions which ends in a slash. */
590 for (tem = Vcompletion_ignored_extensions;
591 CONSP (tem); tem = XCDR (tem))
593 int elt_len;
594 unsigned char *p1;
596 elt = XCAR (tem);
597 if (!STRINGP (elt))
598 continue;
599 /* Need to encode ELT, since scmp compares unibyte
600 strings only. */
601 elt = ENCODE_FILE (elt);
602 elt_len = SCHARS (elt) - 1; /* -1 for trailing / */
603 if (elt_len <= 0)
604 continue;
605 p1 = SDATA (elt);
606 if (p1[elt_len] != '/')
607 continue;
608 skip = len - elt_len;
609 if (skip < 0)
610 continue;
612 if (0 <= scmp (dp->d_name + skip, p1, elt_len))
613 continue;
614 break;
617 else
619 /* Compare extensions-to-be-ignored against end of this file name */
620 /* if name is not an exact match against specified string */
621 if (len > SCHARS (encoded_file))
622 /* and exit this for loop if a match is found */
623 for (tem = Vcompletion_ignored_extensions;
624 CONSP (tem); tem = XCDR (tem))
626 elt = XCAR (tem);
627 if (!STRINGP (elt)) continue;
628 /* Need to encode ELT, since scmp compares unibyte
629 strings only. */
630 elt = ENCODE_FILE (elt);
631 skip = len - SCHARS (elt);
632 if (skip < 0) continue;
634 if (0 <= scmp (dp->d_name + skip,
635 SDATA (elt),
636 SCHARS (elt)))
637 continue;
638 break;
642 /* If an ignored-extensions match was found,
643 don't process this name as a completion. */
644 if (CONSP (tem))
645 canexclude = 1;
647 if (!includeall && canexclude)
648 /* We're not including all files and this file can be excluded. */
649 continue;
651 if (includeall && !canexclude)
652 { /* If we have one non-excludable file, we want to exclude the
653 excudable files. */
654 includeall = 0;
655 /* Throw away any previous excludable match found. */
656 bestmatch = Qnil;
657 bestmatchsize = 0;
658 matchcount = 0;
661 /* FIXME: If we move this `decode' earlier we can eliminate
662 the repeated ENCODE_FILE on Vcompletion_ignored_extensions. */
663 name = make_unibyte_string (dp->d_name, len);
664 name = DECODE_FILE (name);
667 Lisp_Object regexps;
668 Lisp_Object zero;
669 XSETFASTINT (zero, 0);
671 /* Ignore this element if it fails to match all the regexps. */
672 if (completion_ignore_case)
674 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
675 regexps = XCDR (regexps))
676 if (fast_string_match_ignore_case (XCAR (regexps), name) < 0)
677 break;
679 else
681 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
682 regexps = XCDR (regexps))
683 if (fast_string_match (XCAR (regexps), name) < 0)
684 break;
687 if (CONSP (regexps))
688 continue;
691 /* This is a possible completion */
692 if (directoryp)
693 /* This completion is a directory; make it end with '/'. */
694 name = Ffile_name_as_directory (name);
696 /* Test the predicate, if any. */
697 if (!NILP (predicate))
699 Lisp_Object val;
700 struct gcpro gcpro1;
702 GCPRO1 (name);
703 val = call1 (predicate, name);
704 UNGCPRO;
706 if (NILP (val))
707 continue;
710 /* Suitably record this match. */
712 matchcount++;
714 if (all_flag)
715 bestmatch = Fcons (name, bestmatch);
716 else if (NILP (bestmatch))
718 bestmatch = name;
719 bestmatchsize = SCHARS (name);
721 else
723 Lisp_Object zero = make_number (0);
724 /* FIXME: This is a copy of the code in Ftry_completion. */
725 int compare = min (bestmatchsize, SCHARS (name));
726 Lisp_Object tem
727 = Fcompare_strings (bestmatch, zero,
728 make_number (compare),
729 name, zero,
730 make_number (compare),
731 completion_ignore_case ? Qt : Qnil);
732 int matchsize
733 = (EQ (tem, Qt) ? compare
734 : XINT (tem) < 0 ? - XINT (tem) - 1
735 : XINT (tem) - 1);
737 if (completion_ignore_case)
739 /* If this is an exact match except for case,
740 use it as the best match rather than one that is not
741 an exact match. This way, we get the case pattern
742 of the actual match. */
743 /* This tests that the current file is an exact match
744 but BESTMATCH is not (it is too long). */
745 if ((matchsize == SCHARS (name)
746 && matchsize + !!directoryp < SCHARS (bestmatch))
748 /* If there is no exact match ignoring case,
749 prefer a match that does not change the case
750 of the input. */
751 /* If there is more than one exact match aside from
752 case, and one of them is exact including case,
753 prefer that one. */
754 /* This == checks that, of current file and BESTMATCH,
755 either both or neither are exact. */
756 (((matchsize == SCHARS (name))
758 (matchsize + !!directoryp == SCHARS (bestmatch)))
759 && (tem = Fcompare_strings (name, zero,
760 make_number (SCHARS (file)),
761 file, zero,
762 Qnil,
763 Qnil),
764 EQ (Qt, tem))
765 && (tem = Fcompare_strings (bestmatch, zero,
766 make_number (SCHARS (file)),
767 file, zero,
768 Qnil,
769 Qnil),
770 ! EQ (Qt, tem))))
771 bestmatch = name;
773 bestmatchsize = matchsize;
775 /* If the best completion so far is reduced to the string
776 we're trying to complete, then we already know there's no
777 other completion, so there's no point looking any further. */
778 if (matchsize <= SCHARS (file)
779 && !includeall /* A future match may allow includeall to 0. */
780 /* If completion-ignore-case is non-nil, don't
781 short-circuit because we want to find the best
782 possible match *including* case differences. */
783 && (!completion_ignore_case || matchsize == 0)
784 /* The return value depends on whether it's the sole match. */
785 && matchcount > 1)
786 break;
791 UNGCPRO;
792 /* This closes the directory. */
793 bestmatch = unbind_to (count, bestmatch);
795 if (all_flag || NILP (bestmatch))
796 return bestmatch;
797 /* Return t if the supplied string is an exact match (counting case);
798 it does not require any change to be made. */
799 if (matchcount == 1 && !NILP (Fequal (bestmatch, file)))
800 return Qt;
801 bestmatch = Fsubstring (bestmatch, make_number (0),
802 make_number (bestmatchsize));
803 return bestmatch;
806 /* Compare exactly LEN chars of strings at S1 and S2,
807 ignoring case if appropriate.
808 Return -1 if strings match,
809 else number of chars that match at the beginning. */
811 static int
812 scmp (const unsigned char *s1, const unsigned char *s2, int len)
814 register int l = len;
816 if (completion_ignore_case)
818 while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
819 l--;
821 else
823 while (l && *s1++ == *s2++)
824 l--;
826 if (l == 0)
827 return -1;
828 else
829 return len - l;
832 static int
833 file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
835 int len = NAMLEN (dp);
836 int pos = SCHARS (dirname);
837 int value;
838 char *fullname = (char *) alloca (len + pos + 2);
840 #ifdef MSDOS
841 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
842 but aren't required here. Avoid computing the following fields:
843 st_inode, st_size and st_nlink for directories, and the execute bits
844 in st_mode for non-directory files with non-standard extensions. */
846 unsigned short save_djstat_flags = _djstat_flags;
848 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
849 #endif /* MSDOS */
851 memcpy (fullname, SDATA (dirname), pos);
852 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
853 fullname[pos++] = DIRECTORY_SEP;
855 memcpy (fullname + pos, dp->d_name, len);
856 fullname[pos + len] = 0;
858 #ifdef S_IFLNK
859 /* We want to return success if a link points to a nonexistent file,
860 but we want to return the status for what the link points to,
861 in case it is a directory. */
862 value = lstat (fullname, st_addr);
863 stat (fullname, st_addr);
864 return value;
865 #else
866 value = stat (fullname, st_addr);
867 #ifdef MSDOS
868 _djstat_flags = save_djstat_flags;
869 #endif /* MSDOS */
870 return value;
871 #endif /* S_IFLNK */
874 Lisp_Object
875 make_time (time_t time)
877 return Fcons (make_number (time >> 16),
878 Fcons (make_number (time & 0177777), Qnil));
881 static char *
882 stat_uname (struct stat *st)
884 #ifdef WINDOWSNT
885 return st->st_uname;
886 #else
887 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
889 if (pw)
890 return pw->pw_name;
891 else
892 return NULL;
893 #endif
896 static char *
897 stat_gname (struct stat *st)
899 #ifdef WINDOWSNT
900 return st->st_gname;
901 #else
902 struct group *gr = (struct group *) getgrgid (st->st_gid);
904 if (gr)
905 return gr->gr_name;
906 else
907 return NULL;
908 #endif
911 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
912 doc: /* Return a list of attributes of file FILENAME.
913 Value is nil if specified file cannot be opened.
915 ID-FORMAT specifies the preferred format of attributes uid and gid (see
916 below) - valid values are 'string and 'integer. The latter is the
917 default, but we plan to change that, so you should specify a non-nil value
918 for ID-FORMAT if you use the returned uid or gid.
920 Elements of the attribute list are:
921 0. t for directory, string (name linked to) for symbolic link, or nil.
922 1. Number of links to file.
923 2. File uid as a string or a number. If a string value cannot be
924 looked up, a numeric value, either an integer or a float, is returned.
925 3. File gid, likewise.
926 4. Last access time, as a list of two integers.
927 First integer has high-order 16 bits of time, second has low 16 bits.
928 (See a note below about access time on FAT-based filesystems.)
929 5. Last modification time, likewise. This is the time of the last
930 change to the file's contents.
931 6. Last status change time, likewise. This is the time of last change
932 to the file's attributes: owner and group, access mode bits, etc.
933 7. Size in bytes.
934 This is a floating point number if the size is too large for an integer.
935 8. File modes, as a string of ten letters or dashes as in ls -l.
936 9. t if file's gid would change if file were deleted and recreated.
937 10. inode number. If inode number is larger than what Emacs integer
938 can hold, but still fits into a 32-bit number, this is a cons cell
939 containing two integers: first the high part, then the low 16 bits.
940 If the inode number is wider than 32 bits, this is of the form
941 (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
942 and finally the low 16 bits.
943 11. Filesystem device number. If it is larger than what the Emacs
944 integer can hold, this is a cons cell, similar to the inode number.
946 On most filesystems, the combination of the inode and the device
947 number uniquely identifies the file.
949 On MS-Windows, performance depends on `w32-get-true-file-attributes',
950 which see.
952 On some FAT-based filesystems, only the date of last access is recorded,
953 so last access time will always be midnight of that day. */)
954 (Lisp_Object filename, Lisp_Object id_format)
956 Lisp_Object values[12];
957 Lisp_Object encoded;
958 struct stat s;
959 #ifdef BSD4_2
960 Lisp_Object dirname;
961 struct stat sdir;
962 #endif /* BSD4_2 */
963 char modes[10];
964 Lisp_Object handler;
965 struct gcpro gcpro1;
966 char *uname = NULL, *gname = NULL;
968 filename = Fexpand_file_name (filename, Qnil);
970 /* If the file name has special constructs in it,
971 call the corresponding file handler. */
972 handler = Ffind_file_name_handler (filename, Qfile_attributes);
973 if (!NILP (handler))
974 { /* Only pass the extra arg if it is used to help backward compatibility
975 with old file handlers which do not implement the new arg. --Stef */
976 if (NILP (id_format))
977 return call2 (handler, Qfile_attributes, filename);
978 else
979 return call3 (handler, Qfile_attributes, filename, id_format);
982 GCPRO1 (filename);
983 encoded = ENCODE_FILE (filename);
984 UNGCPRO;
986 if (lstat (SDATA (encoded), &s) < 0)
987 return Qnil;
989 switch (s.st_mode & S_IFMT)
991 default:
992 values[0] = Qnil; break;
993 case S_IFDIR:
994 values[0] = Qt; break;
995 #ifdef S_IFLNK
996 case S_IFLNK:
997 values[0] = Ffile_symlink_p (filename); break;
998 #endif
1000 values[1] = make_number (s.st_nlink);
1002 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
1004 BLOCK_INPUT;
1005 uname = stat_uname (&s);
1006 gname = stat_gname (&s);
1007 UNBLOCK_INPUT;
1009 if (uname)
1010 values[2] = DECODE_SYSTEM (build_string (uname));
1011 else
1012 values[2] = make_fixnum_or_float (s.st_uid);
1013 if (gname)
1014 values[3] = DECODE_SYSTEM (build_string (gname));
1015 else
1016 values[3] = make_fixnum_or_float (s.st_gid);
1018 values[4] = make_time (s.st_atime);
1019 values[5] = make_time (s.st_mtime);
1020 values[6] = make_time (s.st_ctime);
1021 values[7] = make_fixnum_or_float (s.st_size);
1022 /* If the size is negative, and its type is long, convert it back to
1023 positive. */
1024 if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
1025 values[7] = make_float ((double) ((unsigned long) s.st_size));
1027 filemodestring (&s, modes);
1028 values[8] = make_string (modes, 10);
1029 #ifdef BSD4_2 /* file gid will be dir gid */
1030 dirname = Ffile_name_directory (filename);
1031 if (! NILP (dirname))
1032 encoded = ENCODE_FILE (dirname);
1033 if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
1034 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
1035 else /* if we can't tell, assume worst */
1036 values[9] = Qt;
1037 #else /* file gid will be egid */
1038 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
1039 #endif /* not BSD4_2 */
1040 if (!FIXNUM_OVERFLOW_P (s.st_ino))
1041 /* Keep the most common cases as integers. */
1042 values[10] = make_number (s.st_ino);
1043 else if (!FIXNUM_OVERFLOW_P (s.st_ino >> 16))
1044 /* To allow inode numbers larger than VALBITS, separate the bottom
1045 16 bits. */
1046 values[10] = Fcons (make_number ((EMACS_INT)(s.st_ino >> 16)),
1047 make_number ((EMACS_INT)(s.st_ino & 0xffff)));
1048 else
1050 /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
1051 high parts and a 16-bit bottom part.
1052 The code on the next line avoids a compiler warning on
1053 systems where st_ino is 32 bit wide. (bug#766). */
1054 EMACS_INT high_ino = s.st_ino >> 31 >> 1;
1055 EMACS_INT low_ino = s.st_ino & 0xffffffff;
1057 values[10] = Fcons (make_number (high_ino >> 8),
1058 Fcons (make_number (((high_ino & 0xff) << 16)
1059 + (low_ino >> 16)),
1060 make_number (low_ino & 0xffff)));
1063 /* Likewise for device. */
1064 if (FIXNUM_OVERFLOW_P (s.st_dev))
1065 values[11] = Fcons (make_number (s.st_dev >> 16),
1066 make_number (s.st_dev & 0xffff));
1067 else
1068 values[11] = make_number (s.st_dev);
1070 return Flist (sizeof(values) / sizeof(values[0]), values);
1073 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
1074 doc: /* Return t if first arg file attributes list is less than second.
1075 Comparison is in lexicographic order and case is significant. */)
1076 (Lisp_Object f1, Lisp_Object f2)
1078 return Fstring_lessp (Fcar (f1), Fcar (f2));
1081 void
1082 syms_of_dired (void)
1084 Qdirectory_files = intern_c_string ("directory-files");
1085 Qdirectory_files_and_attributes = intern_c_string ("directory-files-and-attributes");
1086 Qfile_name_completion = intern_c_string ("file-name-completion");
1087 Qfile_name_all_completions = intern_c_string ("file-name-all-completions");
1088 Qfile_attributes = intern_c_string ("file-attributes");
1089 Qfile_attributes_lessp = intern_c_string ("file-attributes-lessp");
1090 Qdefault_directory = intern_c_string ("default-directory");
1092 staticpro (&Qdirectory_files);
1093 staticpro (&Qdirectory_files_and_attributes);
1094 staticpro (&Qfile_name_completion);
1095 staticpro (&Qfile_name_all_completions);
1096 staticpro (&Qfile_attributes);
1097 staticpro (&Qfile_attributes_lessp);
1098 staticpro (&Qdefault_directory);
1100 defsubr (&Sdirectory_files);
1101 defsubr (&Sdirectory_files_and_attributes);
1102 defsubr (&Sfile_name_completion);
1103 defsubr (&Sfile_name_all_completions);
1104 defsubr (&Sfile_attributes);
1105 defsubr (&Sfile_attributes_lessp);
1107 DEFVAR_LISP ("completion-ignored-extensions", &Vcompletion_ignored_extensions,
1108 doc: /* Completion ignores file names ending in any string in this list.
1109 It does not ignore them if all possible completions end in one of
1110 these strings or when displaying a list of completions.
1111 It ignores directory names if they match any string in this list which
1112 ends in a slash. */);
1113 Vcompletion_ignored_extensions = Qnil;
1116 /* arch-tag: 1ac8deca-4d8f-4d41-ade9-089154d98c03
1117 (do not change this comment) */