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