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