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