* dired.c (directory_files_internal, file_name_completion):
[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 static 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 inner_gcpro1, inner_gcpro2;
237
238 len = NAMLEN (dp);
239 name = finalname = make_unibyte_string (dp->d_name, len);
240 GCPRO2_VAR (finalname, name, inner_gcpro);
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 innermost_gcpro1, innermost_gcpro2;
297
298 decoded_fullname = fileattrs = Qnil;
299 GCPRO2_VAR (decoded_fullname, fileattrs, innermost_gcpro);
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_VAR (innermost_gcpro);
307 }
308 else
309 list = Fcons (finalname, list);
310 }
311
312 UNGCPRO_VAR (inner_gcpro);
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 inner_gcpro1;
680
681 GCPRO1_VAR (name, inner_gcpro);
682 val = call1 (predicate, name);
683 UNGCPRO_VAR (inner_gcpro);
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 cmp
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 (cmp, Qt) ? compare
713 : XINT (cmp) < 0 ? - XINT (cmp) - 1
714 : XINT (cmp) - 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 && (cmp = Fcompare_strings (name, zero,
739 make_number (SCHARS (file)),
740 file, zero,
741 Qnil,
742 Qnil),
743 EQ (Qt, cmp))
744 && (cmp = Fcompare_strings (bestmatch, zero,
745 make_number (SCHARS (file)),
746 file, zero,
747 Qnil,
748 Qnil),
749 ! EQ (Qt, cmp))))
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 static char *
852 stat_uname (struct stat *st)
853 {
854 #ifdef WINDOWSNT
855 return st->st_uname;
856 #else
857 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
858
859 if (pw)
860 return pw->pw_name;
861 else
862 return NULL;
863 #endif
864 }
865
866 static char *
867 stat_gname (struct stat *st)
868 {
869 #ifdef WINDOWSNT
870 return st->st_gname;
871 #else
872 struct group *gr = (struct group *) getgrgid (st->st_gid);
873
874 if (gr)
875 return gr->gr_name;
876 else
877 return NULL;
878 #endif
879 }
880
881 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
882 doc: /* Return a list of attributes of file FILENAME.
883 Value is nil if specified file cannot be opened.
884
885 ID-FORMAT specifies the preferred format of attributes uid and gid (see
886 below) - valid values are 'string and 'integer. The latter is the
887 default, but we plan to change that, so you should specify a non-nil value
888 for ID-FORMAT if you use the returned uid or gid.
889
890 Elements of the attribute list are:
891 0. t for directory, string (name linked to) for symbolic link, or nil.
892 1. Number of links to file.
893 2. File uid as a string or a number. If a string value cannot be
894 looked up, a numeric value, either an integer or a float, is returned.
895 3. File gid, likewise.
896 4. Last access time, as a list of two integers.
897 First integer has high-order 16 bits of time, second has low 16 bits.
898 (See a note below about access time on FAT-based filesystems.)
899 5. Last modification time, likewise. This is the time of the last
900 change to the file's contents.
901 6. Last status change time, likewise. This is the time of last change
902 to the file's attributes: owner and group, access mode bits, etc.
903 7. Size in bytes.
904 This is a floating point number if the size is too large for an integer.
905 8. File modes, as a string of ten letters or dashes as in ls -l.
906 9. t if file's gid would change if file were deleted and recreated.
907 10. inode number. If inode number is larger than what Emacs integer
908 can hold, but still fits into a 32-bit number, this is a cons cell
909 containing two integers: first the high part, then the low 16 bits.
910 If the inode number is wider than 32 bits, this is of the form
911 (HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
912 and finally the low 16 bits.
913 11. Filesystem device number. If it is larger than what the Emacs
914 integer can hold, this is a cons cell, similar to the inode number.
915
916 On most filesystems, the combination of the inode and the device
917 number uniquely identifies the file.
918
919 On MS-Windows, performance depends on `w32-get-true-file-attributes',
920 which see.
921
922 On some FAT-based filesystems, only the date of last access is recorded,
923 so last access time will always be midnight of that day. */)
924 (Lisp_Object filename, Lisp_Object id_format)
925 {
926 Lisp_Object values[12];
927 Lisp_Object encoded;
928 struct stat s;
929 #ifdef BSD4_2
930 Lisp_Object dirname;
931 struct stat sdir;
932 #endif /* BSD4_2 */
933
934 /* An array to hold the mode string generated by filemodestring,
935 including its terminating space and null byte. */
936 char modes[sizeof "-rwxr-xr-x "];
937
938 Lisp_Object handler;
939 struct gcpro gcpro1;
940 char *uname = NULL, *gname = NULL;
941
942 filename = Fexpand_file_name (filename, Qnil);
943
944 /* If the file name has special constructs in it,
945 call the corresponding file handler. */
946 handler = Ffind_file_name_handler (filename, Qfile_attributes);
947 if (!NILP (handler))
948 { /* Only pass the extra arg if it is used to help backward compatibility
949 with old file handlers which do not implement the new arg. --Stef */
950 if (NILP (id_format))
951 return call2 (handler, Qfile_attributes, filename);
952 else
953 return call3 (handler, Qfile_attributes, filename, id_format);
954 }
955
956 GCPRO1 (filename);
957 encoded = ENCODE_FILE (filename);
958 UNGCPRO;
959
960 if (lstat (SSDATA (encoded), &s) < 0)
961 return Qnil;
962
963 values[0] = (S_ISLNK (s.st_mode) ? Ffile_symlink_p (filename)
964 : S_ISDIR (s.st_mode) ? Qt : Qnil);
965 values[1] = make_number (s.st_nlink);
966
967 if (!(NILP (id_format) || EQ (id_format, Qinteger)))
968 {
969 BLOCK_INPUT;
970 uname = stat_uname (&s);
971 gname = stat_gname (&s);
972 UNBLOCK_INPUT;
973 }
974 if (uname)
975 values[2] = DECODE_SYSTEM (build_string (uname));
976 else
977 values[2] = make_fixnum_or_float (s.st_uid);
978 if (gname)
979 values[3] = DECODE_SYSTEM (build_string (gname));
980 else
981 values[3] = make_fixnum_or_float (s.st_gid);
982
983 values[4] = make_time (s.st_atime);
984 values[5] = make_time (s.st_mtime);
985 values[6] = make_time (s.st_ctime);
986 values[7] = make_fixnum_or_float (s.st_size);
987 /* If the size is negative, and its type is long, convert it back to
988 positive. */
989 if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
990 values[7] = make_float ((double) ((unsigned long) s.st_size));
991
992 filemodestring (&s, modes);
993 values[8] = make_string (modes, 10);
994 #ifdef BSD4_2 /* file gid will be dir gid */
995 dirname = Ffile_name_directory (filename);
996 if (! NILP (dirname))
997 encoded = ENCODE_FILE (dirname);
998 if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
999 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
1000 else /* if we can't tell, assume worst */
1001 values[9] = Qt;
1002 #else /* file gid will be egid */
1003 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
1004 #endif /* not BSD4_2 */
1005 if (!FIXNUM_OVERFLOW_P (s.st_ino))
1006 /* Keep the most common cases as integers. */
1007 values[10] = make_number (s.st_ino);
1008 else if (!FIXNUM_OVERFLOW_P (s.st_ino >> 16))
1009 /* To allow inode numbers larger than VALBITS, separate the bottom
1010 16 bits. */
1011 values[10] = Fcons (make_number ((EMACS_INT)(s.st_ino >> 16)),
1012 make_number ((EMACS_INT)(s.st_ino & 0xffff)));
1013 else
1014 {
1015 /* To allow inode numbers beyond 32 bits, separate into 2 24-bit
1016 high parts and a 16-bit bottom part.
1017 The code on the next line avoids a compiler warning on
1018 systems where st_ino is 32 bit wide. (bug#766). */
1019 EMACS_INT high_ino = s.st_ino >> 31 >> 1;
1020 EMACS_INT low_ino = s.st_ino & 0xffffffff;
1021
1022 values[10] = Fcons (make_number (high_ino >> 8),
1023 Fcons (make_number (((high_ino & 0xff) << 16)
1024 + (low_ino >> 16)),
1025 make_number (low_ino & 0xffff)));
1026 }
1027
1028 /* Likewise for device. */
1029 if (FIXNUM_OVERFLOW_P (s.st_dev))
1030 values[11] = Fcons (make_number (s.st_dev >> 16),
1031 make_number (s.st_dev & 0xffff));
1032 else
1033 values[11] = make_number (s.st_dev);
1034
1035 return Flist (sizeof(values) / sizeof(values[0]), values);
1036 }
1037
1038 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
1039 doc: /* Return t if first arg file attributes list is less than second.
1040 Comparison is in lexicographic order and case is significant. */)
1041 (Lisp_Object f1, Lisp_Object f2)
1042 {
1043 return Fstring_lessp (Fcar (f1), Fcar (f2));
1044 }
1045 \f
1046 void
1047 syms_of_dired (void)
1048 {
1049 Qdirectory_files = intern_c_string ("directory-files");
1050 Qdirectory_files_and_attributes = intern_c_string ("directory-files-and-attributes");
1051 Qfile_name_completion = intern_c_string ("file-name-completion");
1052 Qfile_name_all_completions = intern_c_string ("file-name-all-completions");
1053 Qfile_attributes = intern_c_string ("file-attributes");
1054 Qfile_attributes_lessp = intern_c_string ("file-attributes-lessp");
1055 Qdefault_directory = intern_c_string ("default-directory");
1056
1057 staticpro (&Qdirectory_files);
1058 staticpro (&Qdirectory_files_and_attributes);
1059 staticpro (&Qfile_name_completion);
1060 staticpro (&Qfile_name_all_completions);
1061 staticpro (&Qfile_attributes);
1062 staticpro (&Qfile_attributes_lessp);
1063 staticpro (&Qdefault_directory);
1064
1065 defsubr (&Sdirectory_files);
1066 defsubr (&Sdirectory_files_and_attributes);
1067 defsubr (&Sfile_name_completion);
1068 defsubr (&Sfile_name_all_completions);
1069 defsubr (&Sfile_attributes);
1070 defsubr (&Sfile_attributes_lessp);
1071
1072 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
1073 doc: /* Completion ignores file names ending in any string in this list.
1074 It does not ignore them if all possible completions end in one of
1075 these strings or when displaying a list of completions.
1076 It ignores directory names if they match any string in this list which
1077 ends in a slash. */);
1078 Vcompletion_ignored_extensions = Qnil;
1079 }