Merge from trunk
[bpt/emacs.git] / 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 char *, const 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 (SSDATA (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, SSDATA (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 (SSDATA (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, SSDATA (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, SSDATA (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 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 = SSDATA (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 SSDATA (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 char *s1, const char *s2, int len)
800 {
801 register int l = len;
802
803 if (completion_ignore_case)
804 {
805 while (l
806 && (DOWNCASE ((unsigned char) *s1++)
807 == DOWNCASE ((unsigned char) *s2++)))
808 l--;
809 }
810 else
811 {
812 while (l && *s1++ == *s2++)
813 l--;
814 }
815 if (l == 0)
816 return -1;
817 else
818 return len - l;
819 }
820
821 static int
822 file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
823 {
824 int len = NAMLEN (dp);
825 int pos = SCHARS (dirname);
826 int value;
827 char *fullname = (char *) alloca (len + pos + 2);
828
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. */
834
835 unsigned short save_djstat_flags = _djstat_flags;
836
837 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
838 #endif /* MSDOS */
839
840 memcpy (fullname, SDATA (dirname), pos);
841 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
842 fullname[pos++] = DIRECTORY_SEP;
843
844 memcpy (fullname + pos, dp->d_name, len);
845 fullname[pos + len] = 0;
846
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 */
861 }
862 \f
863 Lisp_Object
864 make_time (time_t time)
865 {
866 return Fcons (make_number (time >> 16),
867 Fcons (make_number (time & 0177777), Qnil));
868 }
869
870 static char *
871 stat_uname (struct stat *st)
872 {
873 #ifdef WINDOWSNT
874 return st->st_uname;
875 #else
876 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
877
878 if (pw)
879 return pw->pw_name;
880 else
881 return NULL;
882 #endif
883 }
884
885 static char *
886 stat_gname (struct stat *st)
887 {
888 #ifdef WINDOWSNT
889 return st->st_gname;
890 #else
891 struct group *gr = (struct group *) getgrgid (st->st_gid);
892
893 if (gr)
894 return gr->gr_name;
895 else
896 return NULL;
897 #endif
898 }
899
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.
903
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.
908
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.
934
935 On most filesystems, the combination of the inode and the device
936 number uniquely identifies the file.
937
938 On MS-Windows, performance depends on `w32-get-true-file-attributes',
939 which see.
940
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)
944 {
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;
956
957 filename = Fexpand_file_name (filename, Qnil);
958
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);
969 }
970
971 GCPRO1 (filename);
972 encoded = ENCODE_FILE (filename);
973 UNGCPRO;
974
975 if (lstat (SSDATA (encoded), &s) < 0)
976 return Qnil;
977
978 switch (s.st_mode & S_IFMT)
979 {
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
988 }
989 values[1] = make_number (s.st_nlink);
990
991 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
992 {
993 BLOCK_INPUT;
994 uname = stat_uname (&s);
995 gname = stat_gname (&s);
996 UNBLOCK_INPUT;
997 }
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);
1006
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));
1015
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
1038 {
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;
1045
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)));
1050 }
1051
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);
1058
1059 return Flist (sizeof(values) / sizeof(values[0]), values);
1060 }
1061
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)
1066 {
1067 return Fstring_lessp (Fcar (f1), Fcar (f2));
1068 }
1069 \f
1070 void
1071 syms_of_dired (void)
1072 {
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");
1080
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);
1088
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);
1095
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;
1103 }