Undo change in xdisp.c in 2012-06-29T11:48:08Z!dmantipov@yandex.ru.
[bpt/emacs.git] / src / dired.c
1 /* Lisp functions for making directory listings.
2 Copyright (C) 1985-1986, 1993-1994, 1999-2012 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 #include <stat-time.h>
66
67 #ifdef MSDOS
68 #define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
69 #else
70 #define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
71 #endif
72
73 #include "lisp.h"
74 #include "systime.h"
75 #include "character.h"
76 #include "buffer.h"
77 #include "commands.h"
78 #include "charset.h"
79 #include "coding.h"
80 #include "regex.h"
81 #include "blockinput.h"
82
83 static Lisp_Object Qdirectory_files;
84 static Lisp_Object Qdirectory_files_and_attributes;
85 static Lisp_Object Qfile_name_completion;
86 static Lisp_Object Qfile_name_all_completions;
87 static Lisp_Object Qfile_attributes;
88 static Lisp_Object Qfile_attributes_lessp;
89
90 static ptrdiff_t scmp (const char *, const char *, ptrdiff_t);
91 static Lisp_Object Ffile_attributes (Lisp_Object, Lisp_Object);
92 \f
93 #ifdef WINDOWSNT
94 Lisp_Object
95 directory_files_internal_w32_unwind (Lisp_Object arg)
96 {
97 Vw32_get_true_file_attributes = arg;
98 return Qnil;
99 }
100 #endif
101
102 static Lisp_Object
103 directory_files_internal_unwind (Lisp_Object dh)
104 {
105 DIR *d = (DIR *) XSAVE_VALUE (dh)->pointer;
106 BLOCK_INPUT;
107 closedir (d);
108 UNBLOCK_INPUT;
109 return Qnil;
110 }
111
112 /* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
113 When ATTRS is zero, return a list of directory filenames; when
114 non-zero, return a list of directory filenames and their attributes.
115 In the latter case, ID_FORMAT is passed to Ffile_attributes. */
116
117 Lisp_Object
118 directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, int attrs, Lisp_Object id_format)
119 {
120 DIR *d;
121 ptrdiff_t directory_nbytes;
122 Lisp_Object list, dirfilename, encoded_directory;
123 struct re_pattern_buffer *bufp = NULL;
124 int needsep = 0;
125 ptrdiff_t count = SPECPDL_INDEX ();
126 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
127 DIRENTRY *dp;
128 #ifdef WINDOWSNT
129 Lisp_Object w32_save = Qnil;
130 #endif
131
132 /* Because of file name handlers, these functions might call
133 Ffuncall, and cause a GC. */
134 list = encoded_directory = dirfilename = Qnil;
135 GCPRO5 (match, directory, list, dirfilename, encoded_directory);
136 dirfilename = Fdirectory_file_name (directory);
137
138 if (!NILP (match))
139 {
140 CHECK_STRING (match);
141
142 /* MATCH might be a flawed regular expression. Rather than
143 catching and signaling our own errors, we just call
144 compile_pattern to do the work for us. */
145 /* Pass 1 for the MULTIBYTE arg
146 because we do make multibyte strings if the contents warrant. */
147 # ifdef WINDOWSNT
148 /* Windows users want case-insensitive wildcards. */
149 bufp = compile_pattern (match, 0,
150 BVAR (&buffer_defaults, case_canon_table), 0, 1);
151 # else /* !WINDOWSNT */
152 bufp = compile_pattern (match, 0, Qnil, 0, 1);
153 # endif /* !WINDOWSNT */
154 }
155
156 /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
157 run_pre_post_conversion_on_str which calls Lisp directly and
158 indirectly. */
159 if (STRING_MULTIBYTE (dirfilename))
160 dirfilename = ENCODE_FILE (dirfilename);
161 encoded_directory = (STRING_MULTIBYTE (directory)
162 ? ENCODE_FILE (directory) : directory);
163
164 /* Now *bufp is the compiled form of MATCH; don't call anything
165 which might compile a new regexp until we're done with the loop! */
166
167 BLOCK_INPUT;
168 d = opendir (SSDATA (dirfilename));
169 UNBLOCK_INPUT;
170 if (d == NULL)
171 report_file_error ("Opening directory", Fcons (directory, Qnil));
172
173 /* Unfortunately, we can now invoke expand-file-name and
174 file-attributes on filenames, both of which can throw, so we must
175 do a proper unwind-protect. */
176 record_unwind_protect (directory_files_internal_unwind,
177 make_save_value (d, 0));
178
179 #ifdef WINDOWSNT
180 if (attrs)
181 {
182 extern int is_slow_fs (const char *);
183
184 /* Do this only once to avoid doing it (in w32.c:stat) for each
185 file in the directory, when we call Ffile_attributes below. */
186 record_unwind_protect (directory_files_internal_w32_unwind,
187 Vw32_get_true_file_attributes);
188 w32_save = Vw32_get_true_file_attributes;
189 if (EQ (Vw32_get_true_file_attributes, Qlocal))
190 {
191 /* w32.c:stat will notice these bindings and avoid calling
192 GetDriveType for each file. */
193 if (is_slow_fs (SDATA (dirfilename)))
194 Vw32_get_true_file_attributes = Qnil;
195 else
196 Vw32_get_true_file_attributes = Qt;
197 }
198 }
199 #endif
200
201 directory_nbytes = SBYTES (directory);
202 re_match_object = Qt;
203
204 /* Decide whether we need to add a directory separator. */
205 if (directory_nbytes == 0
206 || !IS_ANY_SEP (SREF (directory, directory_nbytes - 1)))
207 needsep = 1;
208
209 /* Loop reading blocks until EOF or error. */
210 for (;;)
211 {
212 errno = 0;
213 dp = readdir (d);
214
215 if (dp == NULL && (0
216 #ifdef EAGAIN
217 || errno == EAGAIN
218 #endif
219 #ifdef EINTR
220 || errno == EINTR
221 #endif
222 ))
223 { QUIT; continue; }
224
225 if (dp == NULL)
226 break;
227
228 if (DIRENTRY_NONEMPTY (dp))
229 {
230 ptrdiff_t len;
231 int wanted = 0;
232 Lisp_Object name, finalname;
233 struct gcpro gcpro1, gcpro2;
234
235 len = NAMLEN (dp);
236 name = finalname = make_unibyte_string (dp->d_name, len);
237 GCPRO2 (finalname, name);
238
239 /* Note: DECODE_FILE can GC; it should protect its argument,
240 though. */
241 name = DECODE_FILE (name);
242 len = SBYTES (name);
243
244 /* Now that we have unwind_protect in place, we might as well
245 allow matching to be interrupted. */
246 immediate_quit = 1;
247 QUIT;
248
249 if (NILP (match)
250 || (0 <= re_search (bufp, SSDATA (name), len, 0, len, 0)))
251 wanted = 1;
252
253 immediate_quit = 0;
254
255 if (wanted)
256 {
257 if (!NILP (full))
258 {
259 Lisp_Object fullname;
260 ptrdiff_t nbytes = len + directory_nbytes + needsep;
261 ptrdiff_t nchars;
262
263 fullname = make_uninit_multibyte_string (nbytes, nbytes);
264 memcpy (SDATA (fullname), SDATA (directory),
265 directory_nbytes);
266
267 if (needsep)
268 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
269
270 memcpy (SDATA (fullname) + directory_nbytes + needsep,
271 SDATA (name), len);
272
273 nchars = chars_in_text (SDATA (fullname), nbytes);
274
275 /* Some bug somewhere. */
276 if (nchars > nbytes)
277 abort ();
278
279 STRING_SET_CHARS (fullname, nchars);
280 if (nchars == nbytes)
281 STRING_SET_UNIBYTE (fullname);
282
283 finalname = fullname;
284 }
285 else
286 finalname = name;
287
288 if (attrs)
289 {
290 /* Construct an expanded filename for the directory entry.
291 Use the decoded names for input to Ffile_attributes. */
292 Lisp_Object decoded_fullname, fileattrs;
293 struct gcpro gcpro1, gcpro2;
294
295 decoded_fullname = fileattrs = Qnil;
296 GCPRO2 (decoded_fullname, fileattrs);
297
298 /* Both Fexpand_file_name and Ffile_attributes can GC. */
299 decoded_fullname = Fexpand_file_name (name, directory);
300 fileattrs = Ffile_attributes (decoded_fullname, id_format);
301
302 list = Fcons (Fcons (finalname, fileattrs), list);
303 UNGCPRO;
304 }
305 else
306 list = Fcons (finalname, list);
307 }
308
309 UNGCPRO;
310 }
311 }
312
313 BLOCK_INPUT;
314 closedir (d);
315 UNBLOCK_INPUT;
316 #ifdef WINDOWSNT
317 if (attrs)
318 Vw32_get_true_file_attributes = w32_save;
319 #endif
320
321 /* Discard the unwind protect. */
322 specpdl_ptr = specpdl + count;
323
324 if (NILP (nosort))
325 list = Fsort (Fnreverse (list),
326 attrs ? Qfile_attributes_lessp : Qstring_lessp);
327
328 RETURN_UNGCPRO (list);
329 }
330
331
332 DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
333 doc: /* Return a list of names of files in DIRECTORY.
334 There are three optional arguments:
335 If FULL is non-nil, return absolute file names. Otherwise return names
336 that are relative to the specified directory.
337 If MATCH is non-nil, mention only file names that match the regexp MATCH.
338 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
339 Otherwise, the list returned is sorted with `string-lessp'.
340 NOSORT is useful if you plan to sort the result yourself. */)
341 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort)
342 {
343 Lisp_Object handler;
344 directory = Fexpand_file_name (directory, Qnil);
345
346 /* If the file name has special constructs in it,
347 call the corresponding file handler. */
348 handler = Ffind_file_name_handler (directory, Qdirectory_files);
349 if (!NILP (handler))
350 return call5 (handler, Qdirectory_files, directory,
351 full, match, nosort);
352
353 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
354 }
355
356 DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
357 Sdirectory_files_and_attributes, 1, 5, 0,
358 doc: /* Return a list of names of files and their attributes in DIRECTORY.
359 There are four optional arguments:
360 If FULL is non-nil, return absolute file names. Otherwise return names
361 that are relative to the specified directory.
362 If MATCH is non-nil, mention only file names that match the regexp MATCH.
363 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
364 NOSORT is useful if you plan to sort the result yourself.
365 ID-FORMAT specifies the preferred format of attributes uid and gid, see
366 `file-attributes' for further documentation.
367 On MS-Windows, performance depends on `w32-get-true-file-attributes',
368 which see. */)
369 (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, Lisp_Object id_format)
370 {
371 Lisp_Object handler;
372 directory = Fexpand_file_name (directory, Qnil);
373
374 /* If the file name has special constructs in it,
375 call the corresponding file handler. */
376 handler = Ffind_file_name_handler (directory, Qdirectory_files_and_attributes);
377 if (!NILP (handler))
378 return call6 (handler, Qdirectory_files_and_attributes,
379 directory, full, match, nosort, id_format);
380
381 return directory_files_internal (directory, full, match, nosort, 1, id_format);
382 }
383
384 \f
385 static Lisp_Object file_name_completion
386 (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag,
387 Lisp_Object predicate);
388
389 DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
390 2, 3, 0,
391 doc: /* Complete file name FILE in directory DIRECTORY.
392 Returns the longest string
393 common to all file names in DIRECTORY that start with FILE.
394 If there is only one and FILE matches it exactly, returns t.
395 Returns nil if DIRECTORY contains no name starting with FILE.
396
397 If PREDICATE is non-nil, call PREDICATE with each possible
398 completion (in absolute form) and ignore it if PREDICATE returns nil.
399
400 This function ignores some of the possible completions as
401 determined by the variable `completion-ignored-extensions', which see. */)
402 (Lisp_Object file, Lisp_Object directory, Lisp_Object predicate)
403 {
404 Lisp_Object handler;
405 directory = Fexpand_file_name (directory, Qnil);
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 directory = Fexpand_file_name (directory, Qnil);
430
431 /* If the directory name has special constructs in it,
432 call the corresponding file handler. */
433 handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
434 if (!NILP (handler))
435 return call3 (handler, Qfile_name_all_completions, file, directory);
436
437 /* If the file name has special constructs in it,
438 call the corresponding file handler. */
439 handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
440 if (!NILP (handler))
441 return call3 (handler, Qfile_name_all_completions, file, directory);
442
443 return file_name_completion (file, directory, 1, 0, Qnil);
444 }
445
446 static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
447 static Lisp_Object Qdefault_directory;
448
449 static Lisp_Object
450 file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate)
451 {
452 DIR *d;
453 ptrdiff_t bestmatchsize = 0;
454 int matchcount = 0;
455 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
456 If ALL_FLAG is 0, BESTMATCH is either nil
457 or the best match so far, not decoded. */
458 Lisp_Object bestmatch, tem, elt, name;
459 Lisp_Object encoded_file;
460 Lisp_Object encoded_dir;
461 struct stat st;
462 int directoryp;
463 /* If includeall is zero, exclude files in completion-ignored-extensions as
464 well as "." and "..". Until shown otherwise, assume we can't exclude
465 anything. */
466 int includeall = 1;
467 ptrdiff_t count = SPECPDL_INDEX ();
468 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
469
470 elt = Qnil;
471
472 CHECK_STRING (file);
473
474 #ifdef FILE_SYSTEM_CASE
475 file = FILE_SYSTEM_CASE (file);
476 #endif
477 bestmatch = Qnil;
478 encoded_file = encoded_dir = Qnil;
479 GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
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 ptrdiff_t 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 ptrdiff_t 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 ptrdiff_t 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 excludable 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
648 /* Ignore this element if it fails to match all the regexps. */
649 if (completion_ignore_case)
650 {
651 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
652 regexps = XCDR (regexps))
653 if (fast_string_match_ignore_case (XCAR (regexps), name) < 0)
654 break;
655 }
656 else
657 {
658 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
659 regexps = XCDR (regexps))
660 if (fast_string_match (XCAR (regexps), name) < 0)
661 break;
662 }
663
664 if (CONSP (regexps))
665 continue;
666 }
667
668 /* This is a possible completion */
669 if (directoryp)
670 /* This completion is a directory; make it end with '/'. */
671 name = Ffile_name_as_directory (name);
672
673 /* Test the predicate, if any. */
674 if (!NILP (predicate))
675 {
676 Lisp_Object val;
677 struct gcpro gcpro1;
678
679 GCPRO1 (name);
680 val = call1 (predicate, name);
681 UNGCPRO;
682
683 if (NILP (val))
684 continue;
685 }
686
687 /* Suitably record this match. */
688
689 matchcount += matchcount <= 1;
690
691 if (all_flag)
692 bestmatch = Fcons (name, bestmatch);
693 else if (NILP (bestmatch))
694 {
695 bestmatch = name;
696 bestmatchsize = SCHARS (name);
697 }
698 else
699 {
700 Lisp_Object zero = make_number (0);
701 /* FIXME: This is a copy of the code in Ftry_completion. */
702 ptrdiff_t compare = min (bestmatchsize, SCHARS (name));
703 Lisp_Object cmp
704 = Fcompare_strings (bestmatch, zero,
705 make_number (compare),
706 name, zero,
707 make_number (compare),
708 completion_ignore_case ? Qt : Qnil);
709 ptrdiff_t matchsize
710 = (EQ (cmp, Qt) ? compare
711 : XINT (cmp) < 0 ? - XINT (cmp) - 1
712 : XINT (cmp) - 1);
713
714 if (completion_ignore_case)
715 {
716 /* If this is an exact match except for case,
717 use it as the best match rather than one that is not
718 an exact match. This way, we get the case pattern
719 of the actual match. */
720 /* This tests that the current file is an exact match
721 but BESTMATCH is not (it is too long). */
722 if ((matchsize == SCHARS (name)
723 && matchsize + !!directoryp < SCHARS (bestmatch))
724 ||
725 /* If there is no exact match ignoring case,
726 prefer a match that does not change the case
727 of the input. */
728 /* If there is more than one exact match aside from
729 case, and one of them is exact including case,
730 prefer that one. */
731 /* This == checks that, of current file and BESTMATCH,
732 either both or neither are exact. */
733 (((matchsize == SCHARS (name))
734 ==
735 (matchsize + !!directoryp == SCHARS (bestmatch)))
736 && (cmp = Fcompare_strings (name, zero,
737 make_number (SCHARS (file)),
738 file, zero,
739 Qnil,
740 Qnil),
741 EQ (Qt, cmp))
742 && (cmp = Fcompare_strings (bestmatch, zero,
743 make_number (SCHARS (file)),
744 file, zero,
745 Qnil,
746 Qnil),
747 ! EQ (Qt, cmp))))
748 bestmatch = name;
749 }
750 bestmatchsize = matchsize;
751
752 /* If the best completion so far is reduced to the string
753 we're trying to complete, then we already know there's no
754 other completion, so there's no point looking any further. */
755 if (matchsize <= SCHARS (file)
756 && !includeall /* A future match may allow includeall to 0. */
757 /* If completion-ignore-case is non-nil, don't
758 short-circuit because we want to find the best
759 possible match *including* case differences. */
760 && (!completion_ignore_case || matchsize == 0)
761 /* The return value depends on whether it's the sole match. */
762 && matchcount > 1)
763 break;
764
765 }
766 }
767
768 UNGCPRO;
769 /* This closes the directory. */
770 bestmatch = unbind_to (count, bestmatch);
771
772 if (all_flag || NILP (bestmatch))
773 return bestmatch;
774 /* Return t if the supplied string is an exact match (counting case);
775 it does not require any change to be made. */
776 if (matchcount == 1 && !NILP (Fequal (bestmatch, file)))
777 return Qt;
778 bestmatch = Fsubstring (bestmatch, make_number (0),
779 make_number (bestmatchsize));
780 return bestmatch;
781 }
782
783 /* Compare exactly LEN chars of strings at S1 and S2,
784 ignoring case if appropriate.
785 Return -1 if strings match,
786 else number of chars that match at the beginning. */
787
788 static ptrdiff_t
789 scmp (const char *s1, const char *s2, ptrdiff_t len)
790 {
791 register ptrdiff_t l = len;
792
793 if (completion_ignore_case)
794 {
795 while (l
796 && (downcase ((unsigned char) *s1++)
797 == downcase ((unsigned char) *s2++)))
798 l--;
799 }
800 else
801 {
802 while (l && *s1++ == *s2++)
803 l--;
804 }
805 if (l == 0)
806 return -1;
807 else
808 return len - l;
809 }
810
811 static int
812 file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
813 {
814 ptrdiff_t len = NAMLEN (dp);
815 ptrdiff_t pos = SCHARS (dirname);
816 int value;
817 char *fullname;
818 USE_SAFE_ALLOCA;
819 SAFE_ALLOCA (fullname, char *, 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 SAFE_FREE ();
849 return value;
850 }
851 \f
852 static char *
853 stat_uname (struct stat *st)
854 {
855 #ifdef WINDOWSNT
856 return st->st_uname;
857 #else
858 struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
859
860 if (pw)
861 return pw->pw_name;
862 else
863 return NULL;
864 #endif
865 }
866
867 static char *
868 stat_gname (struct stat *st)
869 {
870 #ifdef WINDOWSNT
871 return st->st_gname;
872 #else
873 struct group *gr = (struct group *) getgrgid (st->st_gid);
874
875 if (gr)
876 return gr->gr_name;
877 else
878 return NULL;
879 #endif
880 }
881
882 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
883 doc: /* Return a list of attributes of file FILENAME.
884 Value is nil if specified file cannot be opened.
885
886 ID-FORMAT specifies the preferred format of attributes uid and gid (see
887 below) - valid values are 'string and 'integer. The latter is the
888 default, but we plan to change that, so you should specify a non-nil value
889 for ID-FORMAT if you use the returned uid or gid.
890
891 Elements of the attribute list are:
892 0. t for directory, string (name linked to) for symbolic link, or nil.
893 1. Number of links to file.
894 2. File uid as a string or a number. If a string value cannot be
895 looked up, a numeric value, either an integer or a float, is returned.
896 3. File gid, likewise.
897 4. Last access time, as a list of integers (HIGH LOW USEC PSEC) in the
898 same style as (current-time).
899 (See a note below about access time on FAT-based filesystems.)
900 5. Last modification time, likewise. This is the time of the last
901 change to the file's contents.
902 6. Last status change time, likewise. This is the time of last change
903 to the file's attributes: owner and group, access mode bits, etc.
904 7. Size in bytes.
905 This is a floating point number if the size is too large for an integer.
906 8. File modes, as a string of ten letters or dashes as in ls -l.
907 9. t if file's gid would change if file were deleted and recreated.
908 10. inode number. If it is larger than what an Emacs integer can hold,
909 this is of the form (HIGH . LOW): first the high bits, then the low 16 bits.
910 If even HIGH is too large for an Emacs integer, this is instead of the form
911 (HIGH MIDDLE . LOW): first the high bits, then the 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_lisp_time (get_stat_atime (&s));
984 values[5] = make_lisp_time (get_stat_mtime (&s));
985 values[6] = make_lisp_time (get_stat_ctime (&s));
986
987 /* If the file size is a 4-byte type, assume that files of sizes in
988 the 2-4 GiB range wrap around to negative values, as this is a
989 common bug on older 32-bit platforms. */
990 if (sizeof (s.st_size) == 4)
991 values[7] = make_fixnum_or_float (s.st_size & 0xffffffffu);
992 else
993 values[7] = make_fixnum_or_float (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 values[10] = INTEGER_TO_CONS (s.st_ino);
1009 values[11] = INTEGER_TO_CONS (s.st_dev);
1010
1011 return Flist (sizeof (values) / sizeof (values[0]), values);
1012 }
1013
1014 DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
1015 doc: /* Return t if first arg file attributes list is less than second.
1016 Comparison is in lexicographic order and case is significant. */)
1017 (Lisp_Object f1, Lisp_Object f2)
1018 {
1019 return Fstring_lessp (Fcar (f1), Fcar (f2));
1020 }
1021 \f
1022
1023 DEFUN ("system-users", Fsystem_users, Ssystem_users, 0, 0, 0,
1024 doc: /* Return a list of user names currently registered in the system.
1025 If we don't know how to determine that on this platform, just
1026 return a list with one element, taken from `user-real-login-name'. */)
1027 (void)
1028 {
1029 Lisp_Object users = Qnil;
1030 #if defined HAVE_GETPWENT && defined HAVE_ENDPWENT
1031 struct passwd *pw;
1032
1033 while ((pw = getpwent ()))
1034 users = Fcons (DECODE_SYSTEM (build_string (pw->pw_name)), users);
1035
1036 endpwent ();
1037 #endif
1038 if (EQ (users, Qnil))
1039 /* At least current user is always known. */
1040 users = Fcons (Vuser_real_login_name, Qnil);
1041 return users;
1042 }
1043
1044 DEFUN ("system-groups", Fsystem_groups, Ssystem_groups, 0, 0, 0,
1045 doc: /* Return a list of user group names currently registered in the system.
1046 The value may be nil if not supported on this platform. */)
1047 (void)
1048 {
1049 Lisp_Object groups = Qnil;
1050 #if defined HAVE_GETGRENT && defined HAVE_ENDGRENT
1051 struct group *gr;
1052
1053 while ((gr = getgrent ()))
1054 groups = Fcons (DECODE_SYSTEM (build_string (gr->gr_name)), groups);
1055
1056 endgrent ();
1057 #endif
1058 return groups;
1059 }
1060
1061 void
1062 syms_of_dired (void)
1063 {
1064 DEFSYM (Qdirectory_files, "directory-files");
1065 DEFSYM (Qdirectory_files_and_attributes, "directory-files-and-attributes");
1066 DEFSYM (Qfile_name_completion, "file-name-completion");
1067 DEFSYM (Qfile_name_all_completions, "file-name-all-completions");
1068 DEFSYM (Qfile_attributes, "file-attributes");
1069 DEFSYM (Qfile_attributes_lessp, "file-attributes-lessp");
1070 DEFSYM (Qdefault_directory, "default-directory");
1071
1072 defsubr (&Sdirectory_files);
1073 defsubr (&Sdirectory_files_and_attributes);
1074 defsubr (&Sfile_name_completion);
1075 defsubr (&Sfile_name_all_completions);
1076 defsubr (&Sfile_attributes);
1077 defsubr (&Sfile_attributes_lessp);
1078 defsubr (&Ssystem_users);
1079 defsubr (&Ssystem_groups);
1080
1081 DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
1082 doc: /* Completion ignores file names ending in any string in this list.
1083 It does not ignore them if all possible completions end in one of
1084 these strings or when displaying a list of completions.
1085 It ignores directory names if they match any string in this list which
1086 ends in a slash. */);
1087 Vcompletion_ignored_extensions = Qnil;
1088 }