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