dired-x.el misc cleanup.
[emacs.git] / src / dired.c
blobe37055258d68f7edd3c950964abaa6edbbcacca9
1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985-1986, 1993-1994, 1999-2011 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 #include <config.h>
22 #include <stdio.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <setjmp.h>
27 #ifdef HAVE_PWD_H
28 #include <pwd.h>
29 #endif
30 #include <grp.h>
32 #include <errno.h>
33 #include <unistd.h>
35 /* The d_nameln member of a struct dirent includes the '\0' character
36 on some systems, but not on others. What's worse, you can't tell
37 at compile-time which one it will be, since it really depends on
38 the sort of system providing the filesystem you're reading from,
39 not the system you are running on. Paul Eggert
40 <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
41 SunOS 4.1.2 host, reading a directory that is remote-mounted from a
42 Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
44 Since applying strlen to the name always works, we'll just do that. */
45 #define NAMLEN(p) strlen (p->d_name)
47 #ifdef HAVE_DIRENT_H
49 #include <dirent.h>
50 #define DIRENTRY struct dirent
52 #else /* not HAVE_DIRENT_H */
54 #include <sys/dir.h>
55 #include <sys/stat.h>
57 #define DIRENTRY struct direct
59 extern DIR *opendir (char *);
60 extern struct direct *readdir (DIR *);
62 #endif /* HAVE_DIRENT_H */
64 #ifdef MSDOS
65 #define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
66 #else
67 #define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
68 #endif
70 #include "lisp.h"
71 #include "systime.h"
72 #include "buffer.h"
73 #include "commands.h"
74 #include "character.h"
75 #include "charset.h"
76 #include "coding.h"
77 #include "regex.h"
78 #include "blockinput.h"
80 /* Returns a search buffer, with a fastmap allocated and ready to go. */
81 extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
82 struct re_registers *,
83 Lisp_Object, int, int);
85 /* From filemode.c. Can't go in Lisp.h because of `stat'. */
86 extern void filemodestring (struct stat *, char *);
88 /* if system does not have symbolic links, it does not have lstat.
89 In that case, use ordinary stat instead. */
91 #ifndef S_IFLNK
92 #define lstat stat
93 #endif
95 Lisp_Object Qdirectory_files;
96 Lisp_Object Qdirectory_files_and_attributes;
97 Lisp_Object Qfile_name_completion;
98 Lisp_Object Qfile_name_all_completions;
99 Lisp_Object Qfile_attributes;
100 Lisp_Object Qfile_attributes_lessp;
102 static int scmp (const char *, const char *, int);
104 #ifdef WINDOWSNT
105 Lisp_Object
106 directory_files_internal_w32_unwind (Lisp_Object arg)
108 Vw32_get_true_file_attributes = arg;
109 return Qnil;
111 #endif
113 Lisp_Object
114 directory_files_internal_unwind (Lisp_Object dh)
116 DIR *d = (DIR *) XSAVE_VALUE (dh)->pointer;
117 BLOCK_INPUT;
118 closedir (d);
119 UNBLOCK_INPUT;
120 return Qnil;
123 /* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
124 When ATTRS is zero, return a list of directory filenames; when
125 non-zero, return a list of directory filenames and their attributes.
126 In the latter case, ID_FORMAT is passed to Ffile_attributes. */
128 Lisp_Object
129 directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, int attrs, Lisp_Object id_format)
131 DIR *d;
132 int directory_nbytes;
133 Lisp_Object list, dirfilename, encoded_directory;
134 struct re_pattern_buffer *bufp = NULL;
135 int needsep = 0;
136 int count = SPECPDL_INDEX ();
137 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
138 DIRENTRY *dp;
139 #ifdef WINDOWSNT
140 Lisp_Object w32_save = Qnil;
141 #endif
143 /* Because of file name handlers, these functions might call
144 Ffuncall, and cause a GC. */
145 list = encoded_directory = dirfilename = Qnil;
146 GCPRO5 (match, directory, list, dirfilename, encoded_directory);
147 dirfilename = Fdirectory_file_name (directory);
149 if (!NILP (match))
151 CHECK_STRING (match);
153 /* MATCH might be a flawed regular expression. Rather than
154 catching and signaling our own errors, we just call
155 compile_pattern to do the work for us. */
156 /* Pass 1 for the MULTIBYTE arg
157 because we do make multibyte strings if the contents warrant. */
158 # ifdef WINDOWSNT
159 /* Windows users want case-insensitive wildcards. */
160 bufp = compile_pattern (match, 0,
161 buffer_defaults.case_canon_table, 0, 1);
162 # else /* !WINDOWSNT */
163 bufp = compile_pattern (match, 0, Qnil, 0, 1);
164 # endif /* !WINDOWSNT */
167 /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
168 run_pre_post_conversion_on_str which calls Lisp directly and
169 indirectly. */
170 if (STRING_MULTIBYTE (dirfilename))
171 dirfilename = ENCODE_FILE (dirfilename);
172 encoded_directory = (STRING_MULTIBYTE (directory)
173 ? ENCODE_FILE (directory) : directory);
175 /* Now *bufp is the compiled form of MATCH; don't call anything
176 which might compile a new regexp until we're done with the loop! */
178 BLOCK_INPUT;
179 d = opendir (SSDATA (dirfilename));
180 UNBLOCK_INPUT;
181 if (d == NULL)
182 report_file_error ("Opening directory", Fcons (directory, Qnil));
184 /* Unfortunately, we can now invoke expand-file-name and
185 file-attributes on filenames, both of which can throw, so we must
186 do a proper unwind-protect. */
187 record_unwind_protect (directory_files_internal_unwind,
188 make_save_value (d, 0));
190 #ifdef WINDOWSNT
191 if (attrs)
193 extern int is_slow_fs (const char *);
195 /* Do this only once to avoid doing it (in w32.c:stat) for each
196 file in the directory, when we call Ffile_attributes below. */
197 record_unwind_protect (directory_files_internal_w32_unwind,
198 Vw32_get_true_file_attributes);
199 w32_save = Vw32_get_true_file_attributes;
200 if (EQ (Vw32_get_true_file_attributes, Qlocal))
202 /* w32.c:stat will notice these bindings and avoid calling
203 GetDriveType for each file. */
204 if (is_slow_fs (SDATA (dirfilename)))
205 Vw32_get_true_file_attributes = Qnil;
206 else
207 Vw32_get_true_file_attributes = Qt;
210 #endif
212 directory_nbytes = SBYTES (directory);
213 re_match_object = Qt;
215 /* Decide whether we need to add a directory separator. */
216 if (directory_nbytes == 0
217 || !IS_ANY_SEP (SREF (directory, directory_nbytes - 1)))
218 needsep = 1;
220 /* Loop reading blocks until EOF or error. */
221 for (;;)
223 errno = 0;
224 dp = readdir (d);
226 if (dp == NULL && (0
227 #ifdef EAGAIN
228 || errno == EAGAIN
229 #endif
230 #ifdef EINTR
231 || errno == EINTR
232 #endif
234 { QUIT; continue; }
236 if (dp == NULL)
237 break;
239 if (DIRENTRY_NONEMPTY (dp))
241 int len;
242 int wanted = 0;
243 Lisp_Object name, finalname;
244 struct gcpro gcpro1, gcpro2;
246 len = NAMLEN (dp);
247 name = finalname = make_unibyte_string (dp->d_name, len);
248 GCPRO2 (finalname, name);
250 /* Note: DECODE_FILE can GC; it should protect its argument,
251 though. */
252 name = DECODE_FILE (name);
253 len = SBYTES (name);
255 /* Now that we have unwind_protect in place, we might as well
256 allow matching to be interrupted. */
257 immediate_quit = 1;
258 QUIT;
260 if (NILP (match)
261 || (0 <= re_search (bufp, SSDATA (name), len, 0, len, 0)))
262 wanted = 1;
264 immediate_quit = 0;
266 if (wanted)
268 if (!NILP (full))
270 Lisp_Object fullname;
271 int nbytes = len + directory_nbytes + needsep;
272 int nchars;
274 fullname = make_uninit_multibyte_string (nbytes, nbytes);
275 memcpy (SDATA (fullname), SDATA (directory),
276 directory_nbytes);
278 if (needsep)
279 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
281 memcpy (SDATA (fullname) + directory_nbytes + needsep,
282 SDATA (name), len);
284 nchars = chars_in_text (SDATA (fullname), nbytes);
286 /* Some bug somewhere. */
287 if (nchars > nbytes)
288 abort ();
290 STRING_SET_CHARS (fullname, nchars);
291 if (nchars == nbytes)
292 STRING_SET_UNIBYTE (fullname);
294 finalname = fullname;
296 else
297 finalname = name;
299 if (attrs)
301 /* Construct an expanded filename for the directory entry.
302 Use the decoded names for input to Ffile_attributes. */
303 Lisp_Object decoded_fullname, fileattrs;
304 struct gcpro gcpro1, gcpro2;
306 decoded_fullname = fileattrs = Qnil;
307 GCPRO2 (decoded_fullname, fileattrs);
309 /* Both Fexpand_file_name and Ffile_attributes can GC. */
310 decoded_fullname = Fexpand_file_name (name, directory);
311 fileattrs = Ffile_attributes (decoded_fullname, id_format);
313 list = Fcons (Fcons (finalname, fileattrs), list);
314 UNGCPRO;
316 else
317 list = Fcons (finalname, list);
320 UNGCPRO;
324 BLOCK_INPUT;
325 closedir (d);
326 UNBLOCK_INPUT;
327 #ifdef WINDOWSNT
328 if (attrs)
329 Vw32_get_true_file_attributes = w32_save;
330 #endif
332 /* Discard the unwind protect. */
333 specpdl_ptr = specpdl + count;
335 if (NILP (nosort))
336 list = Fsort (Fnreverse (list),
337 attrs ? Qfile_attributes_lessp : Qstring_lessp);
339 RETURN_UNGCPRO (list);
343 DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
344 doc: /* Return a list of names of files in DIRECTORY.
345 There are three optional arguments:
346 If FULL is non-nil, return absolute file names. Otherwise return names
347 that are relative to the specified directory.
348 If MATCH is non-nil, mention only file names that match the regexp MATCH.
349 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
350 Otherwise, the list returned is sorted with `string-lessp'.
351 NOSORT is useful if you plan to sort the result yourself. */)
352 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort)
354 Lisp_Object handler;
355 directory = Fexpand_file_name (directory, Qnil);
357 /* If the file name has special constructs in it,
358 call the corresponding file handler. */
359 handler = Ffind_file_name_handler (directory, Qdirectory_files);
360 if (!NILP (handler))
361 return call5 (handler, Qdirectory_files, directory,
362 full, match, nosort);
364 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
367 DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
368 Sdirectory_files_and_attributes, 1, 5, 0,
369 doc: /* Return a list of names of files and their attributes in DIRECTORY.
370 There are four optional arguments:
371 If FULL is non-nil, return absolute file names. Otherwise return names
372 that are relative to the specified directory.
373 If MATCH is non-nil, mention only file names that match the regexp MATCH.
374 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
375 NOSORT is useful if you plan to sort the result yourself.
376 ID-FORMAT specifies the preferred format of attributes uid and gid, see
377 `file-attributes' for further documentation.
378 On MS-Windows, performance depends on `w32-get-true-file-attributes',
379 which see. */)
380 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, Lisp_Object id_format)
382 Lisp_Object handler;
383 directory = Fexpand_file_name (directory, Qnil);
385 /* If the file name has special constructs in it,
386 call the corresponding file handler. */
387 handler = Ffind_file_name_handler (directory, Qdirectory_files_and_attributes);
388 if (!NILP (handler))
389 return call6 (handler, Qdirectory_files_and_attributes,
390 directory, full, match, nosort, id_format);
392 return directory_files_internal (directory, full, match, nosort, 1, id_format);
396 Lisp_Object file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate);
398 DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
399 2, 3, 0,
400 doc: /* Complete file name FILE in directory DIRECTORY.
401 Returns the longest string
402 common to all file names in DIRECTORY that start with FILE.
403 If there is only one and FILE matches it exactly, returns t.
404 Returns nil if DIRECTORY contains no name starting with FILE.
406 If PREDICATE is non-nil, call PREDICATE with each possible
407 completion (in absolute form) and ignore it if PREDICATE returns nil.
409 This function ignores some of the possible completions as
410 determined by the variable `completion-ignored-extensions', which see. */)
411 (Lisp_Object file, Lisp_Object directory, Lisp_Object predicate)
413 Lisp_Object handler;
415 /* If the directory name has special constructs in it,
416 call the corresponding file handler. */
417 handler = Ffind_file_name_handler (directory, Qfile_name_completion);
418 if (!NILP (handler))
419 return call4 (handler, Qfile_name_completion, file, directory, predicate);
421 /* If the file name has special constructs in it,
422 call the corresponding file handler. */
423 handler = Ffind_file_name_handler (file, Qfile_name_completion);
424 if (!NILP (handler))
425 return call4 (handler, Qfile_name_completion, file, directory, predicate);
427 return file_name_completion (file, directory, 0, 0, predicate);
430 DEFUN ("file-name-all-completions", Ffile_name_all_completions,
431 Sfile_name_all_completions, 2, 2, 0,
432 doc: /* Return a list of all completions of file name FILE in directory DIRECTORY.
433 These are all file names in directory DIRECTORY which begin with FILE. */)
434 (Lisp_Object file, Lisp_Object directory)
436 Lisp_Object handler;
438 /* If the directory name has special constructs in it,
439 call the corresponding file handler. */
440 handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
441 if (!NILP (handler))
442 return call3 (handler, Qfile_name_all_completions, file, directory);
444 /* If the file name has special constructs in it,
445 call the corresponding file handler. */
446 handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
447 if (!NILP (handler))
448 return call3 (handler, Qfile_name_all_completions, file, directory);
450 return file_name_completion (file, directory, 1, 0, Qnil);
453 static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
454 Lisp_Object Qdefault_directory;
456 Lisp_Object
457 file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate)
459 DIR *d;
460 int bestmatchsize = 0;
461 int matchcount = 0;
462 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
463 If ALL_FLAG is 0, BESTMATCH is either nil
464 or the best match so far, not decoded. */
465 Lisp_Object bestmatch, tem, elt, name;
466 Lisp_Object encoded_file;
467 Lisp_Object encoded_dir;
468 struct stat st;
469 int directoryp;
470 /* If includeall is zero, exclude files in completion-ignored-extensions as
471 well as "." and "..". Until shown otherwise, assume we can't exclude
472 anything. */
473 int includeall = 1;
474 int count = SPECPDL_INDEX ();
475 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
477 elt = Qnil;
479 CHECK_STRING (file);
481 #ifdef FILE_SYSTEM_CASE
482 file = FILE_SYSTEM_CASE (file);
483 #endif
484 bestmatch = Qnil;
485 encoded_file = encoded_dir = Qnil;
486 GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
487 dirname = Fexpand_file_name (dirname, Qnil);
488 specbind (Qdefault_directory, dirname);
490 /* Do completion on the encoded file name
491 because the other names in the directory are (we presume)
492 encoded likewise. We decode the completed string at the end. */
493 /* Actually, this is not quite true any more: we do most of the completion
494 work with decoded file names, but we still do some filtering based
495 on the encoded file name. */
496 encoded_file = STRING_MULTIBYTE (file) ? ENCODE_FILE (file) : file;
498 encoded_dir = ENCODE_FILE (dirname);
500 BLOCK_INPUT;
501 d = opendir (SSDATA (Fdirectory_file_name (encoded_dir)));
502 UNBLOCK_INPUT;
503 if (!d)
504 report_file_error ("Opening directory", Fcons (dirname, Qnil));
506 record_unwind_protect (directory_files_internal_unwind,
507 make_save_value (d, 0));
509 /* Loop reading blocks */
510 /* (att3b compiler bug requires do a null comparison this way) */
511 while (1)
513 DIRENTRY *dp;
514 int len;
515 int canexclude = 0;
517 errno = 0;
518 dp = readdir (d);
519 if (dp == NULL && (0
520 # ifdef EAGAIN
521 || errno == EAGAIN
522 # endif
523 # ifdef EINTR
524 || errno == EINTR
525 # endif
527 { QUIT; continue; }
529 if (!dp) break;
531 len = NAMLEN (dp);
533 QUIT;
534 if (! DIRENTRY_NONEMPTY (dp)
535 || len < SCHARS (encoded_file)
536 || 0 <= scmp (dp->d_name, SSDATA (encoded_file),
537 SCHARS (encoded_file)))
538 continue;
540 if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
541 continue;
543 directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
544 tem = Qnil;
545 /* If all_flag is set, always include all.
546 It would not actually be helpful to the user to ignore any possible
547 completions when making a list of them. */
548 if (!all_flag)
550 int skip;
552 #if 0 /* FIXME: The `scmp' call compares an encoded and a decoded string. */
553 /* If this entry matches the current bestmatch, the only
554 thing it can do is increase matchcount, so don't bother
555 investigating it any further. */
556 if (!completion_ignore_case
557 /* The return result depends on whether it's the sole match. */
558 && matchcount > 1
559 && !includeall /* This match may allow includeall to 0. */
560 && len >= bestmatchsize
561 && 0 > scmp (dp->d_name, SSDATA (bestmatch), bestmatchsize))
562 continue;
563 #endif
565 if (directoryp)
567 #ifndef TRIVIAL_DIRECTORY_ENTRY
568 #define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
569 #endif
570 /* "." and ".." are never interesting as completions, and are
571 actually in the way in a directory with only one file. */
572 if (TRIVIAL_DIRECTORY_ENTRY (dp->d_name))
573 canexclude = 1;
574 else if (len > SCHARS (encoded_file))
575 /* Ignore directories if they match an element of
576 completion-ignored-extensions which ends in a slash. */
577 for (tem = Vcompletion_ignored_extensions;
578 CONSP (tem); tem = XCDR (tem))
580 int elt_len;
581 char *p1;
583 elt = XCAR (tem);
584 if (!STRINGP (elt))
585 continue;
586 /* Need to encode ELT, since scmp compares unibyte
587 strings only. */
588 elt = ENCODE_FILE (elt);
589 elt_len = SCHARS (elt) - 1; /* -1 for trailing / */
590 if (elt_len <= 0)
591 continue;
592 p1 = SSDATA (elt);
593 if (p1[elt_len] != '/')
594 continue;
595 skip = len - elt_len;
596 if (skip < 0)
597 continue;
599 if (0 <= scmp (dp->d_name + skip, p1, elt_len))
600 continue;
601 break;
604 else
606 /* Compare extensions-to-be-ignored against end of this file name */
607 /* if name is not an exact match against specified string */
608 if (len > SCHARS (encoded_file))
609 /* and exit this for loop if a match is found */
610 for (tem = Vcompletion_ignored_extensions;
611 CONSP (tem); tem = XCDR (tem))
613 elt = XCAR (tem);
614 if (!STRINGP (elt)) continue;
615 /* Need to encode ELT, since scmp compares unibyte
616 strings only. */
617 elt = ENCODE_FILE (elt);
618 skip = len - SCHARS (elt);
619 if (skip < 0) continue;
621 if (0 <= scmp (dp->d_name + skip,
622 SSDATA (elt),
623 SCHARS (elt)))
624 continue;
625 break;
629 /* If an ignored-extensions match was found,
630 don't process this name as a completion. */
631 if (CONSP (tem))
632 canexclude = 1;
634 if (!includeall && canexclude)
635 /* We're not including all files and this file can be excluded. */
636 continue;
638 if (includeall && !canexclude)
639 { /* If we have one non-excludable file, we want to exclude the
640 excudable files. */
641 includeall = 0;
642 /* Throw away any previous excludable match found. */
643 bestmatch = Qnil;
644 bestmatchsize = 0;
645 matchcount = 0;
648 /* FIXME: If we move this `decode' earlier we can eliminate
649 the repeated ENCODE_FILE on Vcompletion_ignored_extensions. */
650 name = make_unibyte_string (dp->d_name, len);
651 name = DECODE_FILE (name);
654 Lisp_Object regexps;
655 Lisp_Object zero;
656 XSETFASTINT (zero, 0);
658 /* Ignore this element if it fails to match all the regexps. */
659 if (completion_ignore_case)
661 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
662 regexps = XCDR (regexps))
663 if (fast_string_match_ignore_case (XCAR (regexps), name) < 0)
664 break;
666 else
668 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
669 regexps = XCDR (regexps))
670 if (fast_string_match (XCAR (regexps), name) < 0)
671 break;
674 if (CONSP (regexps))
675 continue;
678 /* This is a possible completion */
679 if (directoryp)
680 /* This completion is a directory; make it end with '/'. */
681 name = Ffile_name_as_directory (name);
683 /* Test the predicate, if any. */
684 if (!NILP (predicate))
686 Lisp_Object val;
687 struct gcpro gcpro1;
689 GCPRO1 (name);
690 val = call1 (predicate, name);
691 UNGCPRO;
693 if (NILP (val))
694 continue;
697 /* Suitably record this match. */
699 matchcount++;
701 if (all_flag)
702 bestmatch = Fcons (name, bestmatch);
703 else if (NILP (bestmatch))
705 bestmatch = name;
706 bestmatchsize = SCHARS (name);
708 else
710 Lisp_Object zero = make_number (0);
711 /* FIXME: This is a copy of the code in Ftry_completion. */
712 int compare = min (bestmatchsize, SCHARS (name));
713 Lisp_Object tem
714 = Fcompare_strings (bestmatch, zero,
715 make_number (compare),
716 name, zero,
717 make_number (compare),
718 completion_ignore_case ? Qt : Qnil);
719 int matchsize
720 = (EQ (tem, Qt) ? compare
721 : XINT (tem) < 0 ? - XINT (tem) - 1
722 : XINT (tem) - 1);
724 if (completion_ignore_case)
726 /* If this is an exact match except for case,
727 use it as the best match rather than one that is not
728 an exact match. This way, we get the case pattern
729 of the actual match. */
730 /* This tests that the current file is an exact match
731 but BESTMATCH is not (it is too long). */
732 if ((matchsize == SCHARS (name)
733 && matchsize + !!directoryp < SCHARS (bestmatch))
735 /* If there is no exact match ignoring case,
736 prefer a match that does not change the case
737 of the input. */
738 /* If there is more than one exact match aside from
739 case, and one of them is exact including case,
740 prefer that one. */
741 /* This == checks that, of current file and BESTMATCH,
742 either both or neither are exact. */
743 (((matchsize == SCHARS (name))
745 (matchsize + !!directoryp == SCHARS (bestmatch)))
746 && (tem = Fcompare_strings (name, zero,
747 make_number (SCHARS (file)),
748 file, zero,
749 Qnil,
750 Qnil),
751 EQ (Qt, tem))
752 && (tem = Fcompare_strings (bestmatch, zero,
753 make_number (SCHARS (file)),
754 file, zero,
755 Qnil,
756 Qnil),
757 ! EQ (Qt, tem))))
758 bestmatch = name;
760 bestmatchsize = matchsize;
762 /* If the best completion so far is reduced to the string
763 we're trying to complete, then we already know there's no
764 other completion, so there's no point looking any further. */
765 if (matchsize <= SCHARS (file)
766 && !includeall /* A future match may allow includeall to 0. */
767 /* If completion-ignore-case is non-nil, don't
768 short-circuit because we want to find the best
769 possible match *including* case differences. */
770 && (!completion_ignore_case || matchsize == 0)
771 /* The return value depends on whether it's the sole match. */
772 && matchcount > 1)
773 break;
778 UNGCPRO;
779 /* This closes the directory. */
780 bestmatch = unbind_to (count, bestmatch);
782 if (all_flag || NILP (bestmatch))
783 return bestmatch;
784 /* Return t if the supplied string is an exact match (counting case);
785 it does not require any change to be made. */
786 if (matchcount == 1 && !NILP (Fequal (bestmatch, file)))
787 return Qt;
788 bestmatch = Fsubstring (bestmatch, make_number (0),
789 make_number (bestmatchsize));
790 return bestmatch;
793 /* Compare exactly LEN chars of strings at S1 and S2,
794 ignoring case if appropriate.
795 Return -1 if strings match,
796 else number of chars that match at the beginning. */
798 static int
799 scmp (const char *s1, const char *s2, int len)
801 register int l = len;
803 if (completion_ignore_case)
805 while (l
806 && (DOWNCASE ((unsigned char) *s1++)
807 == DOWNCASE ((unsigned char) *s2++)))
808 l--;
810 else
812 while (l && *s1++ == *s2++)
813 l--;
815 if (l == 0)
816 return -1;
817 else
818 return len - l;
821 static int
822 file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
824 int len = NAMLEN (dp);
825 int pos = SCHARS (dirname);
826 int value;
827 char *fullname = (char *) alloca (len + pos + 2);
829 #ifdef MSDOS
830 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
831 but aren't required here. Avoid computing the following fields:
832 st_inode, st_size and st_nlink for directories, and the execute bits
833 in st_mode for non-directory files with non-standard extensions. */
835 unsigned short save_djstat_flags = _djstat_flags;
837 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
838 #endif /* MSDOS */
840 memcpy (fullname, SDATA (dirname), pos);
841 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
842 fullname[pos++] = DIRECTORY_SEP;
844 memcpy (fullname + pos, dp->d_name, len);
845 fullname[pos + len] = 0;
847 #ifdef S_IFLNK
848 /* We want to return success if a link points to a nonexistent file,
849 but we want to return the status for what the link points to,
850 in case it is a directory. */
851 value = lstat (fullname, st_addr);
852 stat (fullname, st_addr);
853 return value;
854 #else
855 value = stat (fullname, st_addr);
856 #ifdef MSDOS
857 _djstat_flags = save_djstat_flags;
858 #endif /* MSDOS */
859 return value;
860 #endif /* S_IFLNK */
863 Lisp_Object
864 make_time (time_t time)
866 return Fcons (make_number (time >> 16),
867 Fcons (make_number (time & 0177777), Qnil));
870 static char *
871 stat_uname (struct stat *st)
873 #ifdef WINDOWSNT
874 return st->st_uname;
875 #else
876 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
878 if (pw)
879 return pw->pw_name;
880 else
881 return NULL;
882 #endif
885 static char *
886 stat_gname (struct stat *st)
888 #ifdef WINDOWSNT
889 return st->st_gname;
890 #else
891 struct group *gr = (struct group *) getgrgid (st->st_gid);
893 if (gr)
894 return gr->gr_name;
895 else
896 return NULL;
897 #endif
900 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
901 doc: /* Return a list of attributes of file FILENAME.
902 Value is nil if specified file cannot be opened.
904 ID-FORMAT specifies the preferred format of attributes uid and gid (see
905 below) - valid values are 'string and 'integer. The latter is the
906 default, but we plan to change that, so you should specify a non-nil value
907 for ID-FORMAT if you use the returned uid or gid.
909 Elements of the attribute list are:
910 0. t for directory, string (name linked to) for symbolic link, or nil.
911 1. Number of links to file.
912 2. File uid as a string or a number. If a string value cannot be
913 looked up, a numeric value, either an integer or a float, is returned.
914 3. File gid, likewise.
915 4. Last access time, as a list of two integers.
916 First integer has high-order 16 bits of time, second has low 16 bits.
917 (See a note below about access time on FAT-based filesystems.)
918 5. Last modification time, likewise. This is the time of the last
919 change to the file's contents.
920 6. Last status change time, likewise. This is the time of last change
921 to the file's attributes: owner and group, access mode bits, etc.
922 7. Size in bytes.
923 This is a floating point number if the size is too large for an integer.
924 8. File modes, as a string of ten letters or dashes as in ls -l.
925 9. t if file's gid would change if file were deleted and recreated.
926 10. inode number. If inode number is larger than what Emacs integer
927 can hold, but still fits into a 32-bit number, this is a cons cell
928 containing two integers: first the high part, then the low 16 bits.
929 If the inode number is wider than 32 bits, this is of the form
930 (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
931 and finally the low 16 bits.
932 11. Filesystem device number. If it is larger than what the Emacs
933 integer can hold, this is a cons cell, similar to the inode number.
935 On most filesystems, the combination of the inode and the device
936 number uniquely identifies the file.
938 On MS-Windows, performance depends on `w32-get-true-file-attributes',
939 which see.
941 On some FAT-based filesystems, only the date of last access is recorded,
942 so last access time will always be midnight of that day. */)
943 (Lisp_Object filename, Lisp_Object id_format)
945 Lisp_Object values[12];
946 Lisp_Object encoded;
947 struct stat s;
948 #ifdef BSD4_2
949 Lisp_Object dirname;
950 struct stat sdir;
951 #endif /* BSD4_2 */
952 char modes[10];
953 Lisp_Object handler;
954 struct gcpro gcpro1;
955 char *uname = NULL, *gname = NULL;
957 filename = Fexpand_file_name (filename, Qnil);
959 /* If the file name has special constructs in it,
960 call the corresponding file handler. */
961 handler = Ffind_file_name_handler (filename, Qfile_attributes);
962 if (!NILP (handler))
963 { /* Only pass the extra arg if it is used to help backward compatibility
964 with old file handlers which do not implement the new arg. --Stef */
965 if (NILP (id_format))
966 return call2 (handler, Qfile_attributes, filename);
967 else
968 return call3 (handler, Qfile_attributes, filename, id_format);
971 GCPRO1 (filename);
972 encoded = ENCODE_FILE (filename);
973 UNGCPRO;
975 if (lstat (SSDATA (encoded), &s) < 0)
976 return Qnil;
978 switch (s.st_mode & S_IFMT)
980 default:
981 values[0] = Qnil; break;
982 case S_IFDIR:
983 values[0] = Qt; break;
984 #ifdef S_IFLNK
985 case S_IFLNK:
986 values[0] = Ffile_symlink_p (filename); break;
987 #endif
989 values[1] = make_number (s.st_nlink);
991 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
993 BLOCK_INPUT;
994 uname = stat_uname (&s);
995 gname = stat_gname (&s);
996 UNBLOCK_INPUT;
998 if (uname)
999 values[2] = DECODE_SYSTEM (build_string (uname));
1000 else
1001 values[2] = make_fixnum_or_float (s.st_uid);
1002 if (gname)
1003 values[3] = DECODE_SYSTEM (build_string (gname));
1004 else
1005 values[3] = make_fixnum_or_float (s.st_gid);
1007 values[4] = make_time (s.st_atime);
1008 values[5] = make_time (s.st_mtime);
1009 values[6] = make_time (s.st_ctime);
1010 values[7] = make_fixnum_or_float (s.st_size);
1011 /* If the size is negative, and its type is long, convert it back to
1012 positive. */
1013 if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
1014 values[7] = make_float ((double) ((unsigned long) s.st_size));
1016 filemodestring (&s, modes);
1017 values[8] = make_string (modes, 10);
1018 #ifdef BSD4_2 /* file gid will be dir gid */
1019 dirname = Ffile_name_directory (filename);
1020 if (! NILP (dirname))
1021 encoded = ENCODE_FILE (dirname);
1022 if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
1023 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
1024 else /* if we can't tell, assume worst */
1025 values[9] = Qt;
1026 #else /* file gid will be egid */
1027 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
1028 #endif /* not BSD4_2 */
1029 if (!FIXNUM_OVERFLOW_P (s.st_ino))
1030 /* Keep the most common cases as integers. */
1031 values[10] = make_number (s.st_ino);
1032 else if (!FIXNUM_OVERFLOW_P (s.st_ino >> 16))
1033 /* To allow inode numbers larger than VALBITS, separate the bottom
1034 16 bits. */
1035 values[10] = Fcons (make_number ((EMACS_INT)(s.st_ino >> 16)),
1036 make_number ((EMACS_INT)(s.st_ino & 0xffff)));
1037 else
1039 /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
1040 high parts and a 16-bit bottom part.
1041 The code on the next line avoids a compiler warning on
1042 systems where st_ino is 32 bit wide. (bug#766). */
1043 EMACS_INT high_ino = s.st_ino >> 31 >> 1;
1044 EMACS_INT low_ino = s.st_ino & 0xffffffff;
1046 values[10] = Fcons (make_number (high_ino >> 8),
1047 Fcons (make_number (((high_ino & 0xff) << 16)
1048 + (low_ino >> 16)),
1049 make_number (low_ino & 0xffff)));
1052 /* Likewise for device. */
1053 if (FIXNUM_OVERFLOW_P (s.st_dev))
1054 values[11] = Fcons (make_number (s.st_dev >> 16),
1055 make_number (s.st_dev & 0xffff));
1056 else
1057 values[11] = make_number (s.st_dev);
1059 return Flist (sizeof(values) / sizeof(values[0]), values);
1062 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
1063 doc: /* Return t if first arg file attributes list is less than second.
1064 Comparison is in lexicographic order and case is significant. */)
1065 (Lisp_Object f1, Lisp_Object f2)
1067 return Fstring_lessp (Fcar (f1), Fcar (f2));
1070 void
1071 syms_of_dired (void)
1073 Qdirectory_files = intern_c_string ("directory-files");
1074 Qdirectory_files_and_attributes = intern_c_string ("directory-files-and-attributes");
1075 Qfile_name_completion = intern_c_string ("file-name-completion");
1076 Qfile_name_all_completions = intern_c_string ("file-name-all-completions");
1077 Qfile_attributes = intern_c_string ("file-attributes");
1078 Qfile_attributes_lessp = intern_c_string ("file-attributes-lessp");
1079 Qdefault_directory = intern_c_string ("default-directory");
1081 staticpro (&Qdirectory_files);
1082 staticpro (&Qdirectory_files_and_attributes);
1083 staticpro (&Qfile_name_completion);
1084 staticpro (&Qfile_name_all_completions);
1085 staticpro (&Qfile_attributes);
1086 staticpro (&Qfile_attributes_lessp);
1087 staticpro (&Qdefault_directory);
1089 defsubr (&Sdirectory_files);
1090 defsubr (&Sdirectory_files_and_attributes);
1091 defsubr (&Sfile_name_completion);
1092 defsubr (&Sfile_name_all_completions);
1093 defsubr (&Sfile_attributes);
1094 defsubr (&Sfile_attributes_lessp);
1096 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
1097 doc: /* Completion ignores file names ending in any string in this list.
1098 It does not ignore them if all possible completions end in one of
1099 these strings or when displaying a list of completions.
1100 It ignores directory names if they match any string in this list which
1101 ends in a slash. */);
1102 Vcompletion_ignored_extensions = Qnil;