gnus-art.el: Rewrite the Date header formatting functionality.
[emacs.git] / src / dired.c
blob08aa230f65fe6b8c9b66d606a7553725bd427681
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 unsigned char *, const unsigned 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, SDATA (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, SDATA (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 unsigned 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 = SDATA (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 SDATA (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 unsigned char *s1, const unsigned char *s2, int len)
801 register int l = len;
803 if (completion_ignore_case)
805 while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
806 l--;
808 else
810 while (l && *s1++ == *s2++)
811 l--;
813 if (l == 0)
814 return -1;
815 else
816 return len - l;
819 static int
820 file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
822 int len = NAMLEN (dp);
823 int pos = SCHARS (dirname);
824 int value;
825 char *fullname = (char *) alloca (len + pos + 2);
827 #ifdef MSDOS
828 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
829 but aren't required here. Avoid computing the following fields:
830 st_inode, st_size and st_nlink for directories, and the execute bits
831 in st_mode for non-directory files with non-standard extensions. */
833 unsigned short save_djstat_flags = _djstat_flags;
835 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
836 #endif /* MSDOS */
838 memcpy (fullname, SDATA (dirname), pos);
839 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
840 fullname[pos++] = DIRECTORY_SEP;
842 memcpy (fullname + pos, dp->d_name, len);
843 fullname[pos + len] = 0;
845 #ifdef S_IFLNK
846 /* We want to return success if a link points to a nonexistent file,
847 but we want to return the status for what the link points to,
848 in case it is a directory. */
849 value = lstat (fullname, st_addr);
850 stat (fullname, st_addr);
851 return value;
852 #else
853 value = stat (fullname, st_addr);
854 #ifdef MSDOS
855 _djstat_flags = save_djstat_flags;
856 #endif /* MSDOS */
857 return value;
858 #endif /* S_IFLNK */
861 Lisp_Object
862 make_time (time_t time)
864 return Fcons (make_number (time >> 16),
865 Fcons (make_number (time & 0177777), Qnil));
868 static char *
869 stat_uname (struct stat *st)
871 #ifdef WINDOWSNT
872 return st->st_uname;
873 #else
874 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
876 if (pw)
877 return pw->pw_name;
878 else
879 return NULL;
880 #endif
883 static char *
884 stat_gname (struct stat *st)
886 #ifdef WINDOWSNT
887 return st->st_gname;
888 #else
889 struct group *gr = (struct group *) getgrgid (st->st_gid);
891 if (gr)
892 return gr->gr_name;
893 else
894 return NULL;
895 #endif
898 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
899 doc: /* Return a list of attributes of file FILENAME.
900 Value is nil if specified file cannot be opened.
902 ID-FORMAT specifies the preferred format of attributes uid and gid (see
903 below) - valid values are 'string and 'integer. The latter is the
904 default, but we plan to change that, so you should specify a non-nil value
905 for ID-FORMAT if you use the returned uid or gid.
907 Elements of the attribute list are:
908 0. t for directory, string (name linked to) for symbolic link, or nil.
909 1. Number of links to file.
910 2. File uid as a string or a number. If a string value cannot be
911 looked up, a numeric value, either an integer or a float, is returned.
912 3. File gid, likewise.
913 4. Last access time, as a list of two integers.
914 First integer has high-order 16 bits of time, second has low 16 bits.
915 (See a note below about access time on FAT-based filesystems.)
916 5. Last modification time, likewise. This is the time of the last
917 change to the file's contents.
918 6. Last status change time, likewise. This is the time of last change
919 to the file's attributes: owner and group, access mode bits, etc.
920 7. Size in bytes.
921 This is a floating point number if the size is too large for an integer.
922 8. File modes, as a string of ten letters or dashes as in ls -l.
923 9. t if file's gid would change if file were deleted and recreated.
924 10. inode number. If inode number is larger than what Emacs integer
925 can hold, but still fits into a 32-bit number, this is a cons cell
926 containing two integers: first the high part, then the low 16 bits.
927 If the inode number is wider than 32 bits, this is of the form
928 (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
929 and finally the low 16 bits.
930 11. Filesystem device number. If it is larger than what the Emacs
931 integer can hold, this is a cons cell, similar to the inode number.
933 On most filesystems, the combination of the inode and the device
934 number uniquely identifies the file.
936 On MS-Windows, performance depends on `w32-get-true-file-attributes',
937 which see.
939 On some FAT-based filesystems, only the date of last access is recorded,
940 so last access time will always be midnight of that day. */)
941 (Lisp_Object filename, Lisp_Object id_format)
943 Lisp_Object values[12];
944 Lisp_Object encoded;
945 struct stat s;
946 #ifdef BSD4_2
947 Lisp_Object dirname;
948 struct stat sdir;
949 #endif /* BSD4_2 */
950 char modes[10];
951 Lisp_Object handler;
952 struct gcpro gcpro1;
953 char *uname = NULL, *gname = NULL;
955 filename = Fexpand_file_name (filename, Qnil);
957 /* If the file name has special constructs in it,
958 call the corresponding file handler. */
959 handler = Ffind_file_name_handler (filename, Qfile_attributes);
960 if (!NILP (handler))
961 { /* Only pass the extra arg if it is used to help backward compatibility
962 with old file handlers which do not implement the new arg. --Stef */
963 if (NILP (id_format))
964 return call2 (handler, Qfile_attributes, filename);
965 else
966 return call3 (handler, Qfile_attributes, filename, id_format);
969 GCPRO1 (filename);
970 encoded = ENCODE_FILE (filename);
971 UNGCPRO;
973 if (lstat (SSDATA (encoded), &s) < 0)
974 return Qnil;
976 switch (s.st_mode & S_IFMT)
978 default:
979 values[0] = Qnil; break;
980 case S_IFDIR:
981 values[0] = Qt; break;
982 #ifdef S_IFLNK
983 case S_IFLNK:
984 values[0] = Ffile_symlink_p (filename); break;
985 #endif
987 values[1] = make_number (s.st_nlink);
989 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
991 BLOCK_INPUT;
992 uname = stat_uname (&s);
993 gname = stat_gname (&s);
994 UNBLOCK_INPUT;
996 if (uname)
997 values[2] = DECODE_SYSTEM (build_string (uname));
998 else
999 values[2] = make_fixnum_or_float (s.st_uid);
1000 if (gname)
1001 values[3] = DECODE_SYSTEM (build_string (gname));
1002 else
1003 values[3] = make_fixnum_or_float (s.st_gid);
1005 values[4] = make_time (s.st_atime);
1006 values[5] = make_time (s.st_mtime);
1007 values[6] = make_time (s.st_ctime);
1008 values[7] = make_fixnum_or_float (s.st_size);
1009 /* If the size is negative, and its type is long, convert it back to
1010 positive. */
1011 if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
1012 values[7] = make_float ((double) ((unsigned long) s.st_size));
1014 filemodestring (&s, modes);
1015 values[8] = make_string (modes, 10);
1016 #ifdef BSD4_2 /* file gid will be dir gid */
1017 dirname = Ffile_name_directory (filename);
1018 if (! NILP (dirname))
1019 encoded = ENCODE_FILE (dirname);
1020 if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
1021 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
1022 else /* if we can't tell, assume worst */
1023 values[9] = Qt;
1024 #else /* file gid will be egid */
1025 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
1026 #endif /* not BSD4_2 */
1027 if (!FIXNUM_OVERFLOW_P (s.st_ino))
1028 /* Keep the most common cases as integers. */
1029 values[10] = make_number (s.st_ino);
1030 else if (!FIXNUM_OVERFLOW_P (s.st_ino >> 16))
1031 /* To allow inode numbers larger than VALBITS, separate the bottom
1032 16 bits. */
1033 values[10] = Fcons (make_number ((EMACS_INT)(s.st_ino >> 16)),
1034 make_number ((EMACS_INT)(s.st_ino & 0xffff)));
1035 else
1037 /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
1038 high parts and a 16-bit bottom part.
1039 The code on the next line avoids a compiler warning on
1040 systems where st_ino is 32 bit wide. (bug#766). */
1041 EMACS_INT high_ino = s.st_ino >> 31 >> 1;
1042 EMACS_INT low_ino = s.st_ino & 0xffffffff;
1044 values[10] = Fcons (make_number (high_ino >> 8),
1045 Fcons (make_number (((high_ino & 0xff) << 16)
1046 + (low_ino >> 16)),
1047 make_number (low_ino & 0xffff)));
1050 /* Likewise for device. */
1051 if (FIXNUM_OVERFLOW_P (s.st_dev))
1052 values[11] = Fcons (make_number (s.st_dev >> 16),
1053 make_number (s.st_dev & 0xffff));
1054 else
1055 values[11] = make_number (s.st_dev);
1057 return Flist (sizeof(values) / sizeof(values[0]), values);
1060 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
1061 doc: /* Return t if first arg file attributes list is less than second.
1062 Comparison is in lexicographic order and case is significant. */)
1063 (Lisp_Object f1, Lisp_Object f2)
1065 return Fstring_lessp (Fcar (f1), Fcar (f2));
1068 void
1069 syms_of_dired (void)
1071 Qdirectory_files = intern_c_string ("directory-files");
1072 Qdirectory_files_and_attributes = intern_c_string ("directory-files-and-attributes");
1073 Qfile_name_completion = intern_c_string ("file-name-completion");
1074 Qfile_name_all_completions = intern_c_string ("file-name-all-completions");
1075 Qfile_attributes = intern_c_string ("file-attributes");
1076 Qfile_attributes_lessp = intern_c_string ("file-attributes-lessp");
1077 Qdefault_directory = intern_c_string ("default-directory");
1079 staticpro (&Qdirectory_files);
1080 staticpro (&Qdirectory_files_and_attributes);
1081 staticpro (&Qfile_name_completion);
1082 staticpro (&Qfile_name_all_completions);
1083 staticpro (&Qfile_attributes);
1084 staticpro (&Qfile_attributes_lessp);
1085 staticpro (&Qdefault_directory);
1087 defsubr (&Sdirectory_files);
1088 defsubr (&Sdirectory_files_and_attributes);
1089 defsubr (&Sfile_name_completion);
1090 defsubr (&Sfile_name_all_completions);
1091 defsubr (&Sfile_attributes);
1092 defsubr (&Sfile_attributes_lessp);
1094 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
1095 doc: /* Completion ignores file names ending in any string in this list.
1096 It does not ignore them if all possible completions end in one of
1097 these strings or when displaying a list of completions.
1098 It ignores directory names if they match any string in this list which
1099 ends in a slash. */);
1100 Vcompletion_ignored_extensions = Qnil;