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