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