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