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