]> code.delx.au - gnu-emacs/blob - src/dired.c
Convert consecutive FSF copyright years to ranges.
[gnu-emacs] / src / dired.c
1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985-1986, 1993-1994, 1999-2011 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
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.
10
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.
15
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/>. */
18
19
20 #include <config.h>
21
22 #include <stdio.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <setjmp.h>
26
27 #ifdef HAVE_PWD_H
28 #include <pwd.h>
29 #endif
30 #include <grp.h>
31
32 #include <errno.h>
33 #include <unistd.h>
34
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.
43
44 Since applying strlen to the name always works, we'll just do that. */
45 #define NAMLEN(p) strlen (p->d_name)
46
47 #ifdef HAVE_DIRENT_H
48
49 #include <dirent.h>
50 #define DIRENTRY struct dirent
51
52 #else /* not HAVE_DIRENT_H */
53
54 #include <sys/dir.h>
55 #include <sys/stat.h>
56
57 #define DIRENTRY struct direct
58
59 extern DIR *opendir (char *);
60 extern struct direct *readdir (DIR *);
61
62 #endif /* HAVE_DIRENT_H */
63
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
69
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"
79
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);
84
85 /* From filemode.c. Can't go in Lisp.h because of `stat'. */
86 extern void filemodestring (struct stat *, char *);
87
88 /* if system does not have symbolic links, it does not have lstat.
89 In that case, use ordinary stat instead. */
90
91 #ifndef S_IFLNK
92 #define lstat stat
93 #endif
94
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;
101
102 static int scmp (const unsigned char *, const unsigned char *, int);
103 \f
104 #ifdef WINDOWSNT
105 Lisp_Object
106 directory_files_internal_w32_unwind (Lisp_Object arg)
107 {
108 Vw32_get_true_file_attributes = arg;
109 return Qnil;
110 }
111 #endif
112
113 Lisp_Object
114 directory_files_internal_unwind (Lisp_Object dh)
115 {
116 DIR *d = (DIR *) XSAVE_VALUE (dh)->pointer;
117 BLOCK_INPUT;
118 closedir (d);
119 UNBLOCK_INPUT;
120 return Qnil;
121 }
122
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. */
127
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)
130 {
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
142
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);
148
149 if (!NILP (match))
150 {
151 CHECK_STRING (match);
152
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 */
165 }
166
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);
174
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! */
177
178 BLOCK_INPUT;
179 d = opendir (SDATA (dirfilename));
180 UNBLOCK_INPUT;
181 if (d == NULL)
182 report_file_error ("Opening directory", Fcons (directory, Qnil));
183
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));
189
190 #ifdef WINDOWSNT
191 if (attrs)
192 {
193 extern int is_slow_fs (const char *);
194
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))
201 {
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;
208 }
209 }
210 #endif
211
212 directory_nbytes = SBYTES (directory);
213 re_match_object = Qt;
214
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;
219
220 /* Loop reading blocks until EOF or error. */
221 for (;;)
222 {
223 errno = 0;
224 dp = readdir (d);
225
226 if (dp == NULL && (0
227 #ifdef EAGAIN
228 || errno == EAGAIN
229 #endif
230 #ifdef EINTR
231 || errno == EINTR
232 #endif
233 ))
234 { QUIT; continue; }
235
236 if (dp == NULL)
237 break;
238
239 if (DIRENTRY_NONEMPTY (dp))
240 {
241 int len;
242 int wanted = 0;
243 Lisp_Object name, finalname;
244 struct gcpro gcpro1, gcpro2;
245
246 len = NAMLEN (dp);
247 name = finalname = make_unibyte_string (dp->d_name, len);
248 GCPRO2 (finalname, name);
249
250 /* Note: DECODE_FILE can GC; it should protect its argument,
251 though. */
252 name = DECODE_FILE (name);
253 len = SBYTES (name);
254
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;
259
260 if (NILP (match)
261 || (0 <= re_search (bufp, SDATA (name), len, 0, len, 0)))
262 wanted = 1;
263
264 immediate_quit = 0;
265
266 if (wanted)
267 {
268 if (!NILP (full))
269 {
270 Lisp_Object fullname;
271 int nbytes = len + directory_nbytes + needsep;
272 int nchars;
273
274 fullname = make_uninit_multibyte_string (nbytes, nbytes);
275 memcpy (SDATA (fullname), SDATA (directory),
276 directory_nbytes);
277
278 if (needsep)
279 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
280
281 memcpy (SDATA (fullname) + directory_nbytes + needsep,
282 SDATA (name), len);
283
284 nchars = chars_in_text (SDATA (fullname), nbytes);
285
286 /* Some bug somewhere. */
287 if (nchars > nbytes)
288 abort ();
289
290 STRING_SET_CHARS (fullname, nchars);
291 if (nchars == nbytes)
292 STRING_SET_UNIBYTE (fullname);
293
294 finalname = fullname;
295 }
296 else
297 finalname = name;
298
299 if (attrs)
300 {
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;
305
306 decoded_fullname = fileattrs = Qnil;
307 GCPRO2 (decoded_fullname, fileattrs);
308
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);
312
313 list = Fcons (Fcons (finalname, fileattrs), list);
314 UNGCPRO;
315 }
316 else
317 list = Fcons (finalname, list);
318 }
319
320 UNGCPRO;
321 }
322 }
323
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
331
332 /* Discard the unwind protect. */
333 specpdl_ptr = specpdl + count;
334
335 if (NILP (nosort))
336 list = Fsort (Fnreverse (list),
337 attrs ? Qfile_attributes_lessp : Qstring_lessp);
338
339 RETURN_UNGCPRO (list);
340 }
341
342
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)
353 {
354 Lisp_Object handler;
355 directory = Fexpand_file_name (directory, Qnil);
356
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);
363
364 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
365 }
366
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)
381 {
382 Lisp_Object handler;
383 directory = Fexpand_file_name (directory, Qnil);
384
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);
391
392 return directory_files_internal (directory, full, match, nosort, 1, id_format);
393 }
394
395 \f
396 Lisp_Object file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate);
397
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.
405
406 If PREDICATE is non-nil, call PREDICATE with each possible
407 completion (in absolute form) and ignore it if PREDICATE returns nil.
408
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)
412 {
413 Lisp_Object handler;
414
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);
420
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);
426
427 return file_name_completion (file, directory, 0, 0, predicate);
428 }
429
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)
435 {
436 Lisp_Object handler;
437
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);
443
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);
449
450 return file_name_completion (file, directory, 1, 0, Qnil);
451 }
452
453 static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
454 Lisp_Object Qdefault_directory;
455
456 Lisp_Object
457 file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate)
458 {
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;
476
477 elt = Qnil;
478
479 CHECK_STRING (file);
480
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);
489
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;
497
498 encoded_dir = ENCODE_FILE (dirname);
499
500 BLOCK_INPUT;
501 d = opendir (SDATA (Fdirectory_file_name (encoded_dir)));
502 UNBLOCK_INPUT;
503 if (!d)
504 report_file_error ("Opening directory", Fcons (dirname, Qnil));
505
506 record_unwind_protect (directory_files_internal_unwind,
507 make_save_value (d, 0));
508
509 /* Loop reading blocks */
510 /* (att3b compiler bug requires do a null comparison this way) */
511 while (1)
512 {
513 DIRENTRY *dp;
514 int len;
515 int canexclude = 0;
516
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
526 ))
527 { QUIT; continue; }
528
529 if (!dp) break;
530
531 len = NAMLEN (dp);
532
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;
539
540 if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
541 continue;
542
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)
549 {
550 int skip;
551
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
564
565 if (directoryp)
566 {
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))
579 {
580 int elt_len;
581 unsigned char *p1;
582
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;
598
599 if (0 <= scmp (dp->d_name + skip, p1, elt_len))
600 continue;
601 break;
602 }
603 }
604 else
605 {
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))
612 {
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;
620
621 if (0 <= scmp (dp->d_name + skip,
622 SDATA (elt),
623 SCHARS (elt)))
624 continue;
625 break;
626 }
627 }
628
629 /* If an ignored-extensions match was found,
630 don't process this name as a completion. */
631 if (CONSP (tem))
632 canexclude = 1;
633
634 if (!includeall && canexclude)
635 /* We're not including all files and this file can be excluded. */
636 continue;
637
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;
646 }
647 }
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);
652
653 {
654 Lisp_Object regexps;
655 Lisp_Object zero;
656 XSETFASTINT (zero, 0);
657
658 /* Ignore this element if it fails to match all the regexps. */
659 if (completion_ignore_case)
660 {
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;
665 }
666 else
667 {
668 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
669 regexps = XCDR (regexps))
670 if (fast_string_match (XCAR (regexps), name) < 0)
671 break;
672 }
673
674 if (CONSP (regexps))
675 continue;
676 }
677
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);
682
683 /* Test the predicate, if any. */
684 if (!NILP (predicate))
685 {
686 Lisp_Object val;
687 struct gcpro gcpro1;
688
689 GCPRO1 (name);
690 val = call1 (predicate, name);
691 UNGCPRO;
692
693 if (NILP (val))
694 continue;
695 }
696
697 /* Suitably record this match. */
698
699 matchcount++;
700
701 if (all_flag)
702 bestmatch = Fcons (name, bestmatch);
703 else if (NILP (bestmatch))
704 {
705 bestmatch = name;
706 bestmatchsize = SCHARS (name);
707 }
708 else
709 {
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);
723
724 if (completion_ignore_case)
725 {
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))
734 ||
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))
744 ==
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;
759 }
760 bestmatchsize = matchsize;
761
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;
774
775 }
776 }
777
778 UNGCPRO;
779 /* This closes the directory. */
780 bestmatch = unbind_to (count, bestmatch);
781
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;
791 }
792
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. */
797
798 static int
799 scmp (const unsigned char *s1, const unsigned char *s2, int len)
800 {
801 register int l = len;
802
803 if (completion_ignore_case)
804 {
805 while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
806 l--;
807 }
808 else
809 {
810 while (l && *s1++ == *s2++)
811 l--;
812 }
813 if (l == 0)
814 return -1;
815 else
816 return len - l;
817 }
818
819 static int
820 file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
821 {
822 int len = NAMLEN (dp);
823 int pos = SCHARS (dirname);
824 int value;
825 char *fullname = (char *) alloca (len + pos + 2);
826
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. */
832
833 unsigned short save_djstat_flags = _djstat_flags;
834
835 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
836 #endif /* MSDOS */
837
838 memcpy (fullname, SDATA (dirname), pos);
839 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
840 fullname[pos++] = DIRECTORY_SEP;
841
842 memcpy (fullname + pos, dp->d_name, len);
843 fullname[pos + len] = 0;
844
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 */
859 }
860 \f
861 Lisp_Object
862 make_time (time_t time)
863 {
864 return Fcons (make_number (time >> 16),
865 Fcons (make_number (time & 0177777), Qnil));
866 }
867
868 static char *
869 stat_uname (struct stat *st)
870 {
871 #ifdef WINDOWSNT
872 return st->st_uname;
873 #else
874 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
875
876 if (pw)
877 return pw->pw_name;
878 else
879 return NULL;
880 #endif
881 }
882
883 static char *
884 stat_gname (struct stat *st)
885 {
886 #ifdef WINDOWSNT
887 return st->st_gname;
888 #else
889 struct group *gr = (struct group *) getgrgid (st->st_gid);
890
891 if (gr)
892 return gr->gr_name;
893 else
894 return NULL;
895 #endif
896 }
897
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.
901
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.
906
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.
932
933 On most filesystems, the combination of the inode and the device
934 number uniquely identifies the file.
935
936 On MS-Windows, performance depends on `w32-get-true-file-attributes',
937 which see.
938
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)
942 {
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;
954
955 filename = Fexpand_file_name (filename, Qnil);
956
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);
967 }
968
969 GCPRO1 (filename);
970 encoded = ENCODE_FILE (filename);
971 UNGCPRO;
972
973 if (lstat (SDATA (encoded), &s) < 0)
974 return Qnil;
975
976 switch (s.st_mode & S_IFMT)
977 {
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
986 }
987 values[1] = make_number (s.st_nlink);
988
989 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
990 {
991 BLOCK_INPUT;
992 uname = stat_uname (&s);
993 gname = stat_gname (&s);
994 UNBLOCK_INPUT;
995 }
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);
1004
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));
1013
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
1036 {
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;
1043
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)));
1048 }
1049
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);
1056
1057 return Flist (sizeof(values) / sizeof(values[0]), values);
1058 }
1059
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)
1064 {
1065 return Fstring_lessp (Fcar (f1), Fcar (f2));
1066 }
1067 \f
1068 void
1069 syms_of_dired (void)
1070 {
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");
1078
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);
1086
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);
1093
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;
1101 }
1102