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