files.el: add abort-if-file-too-large and use it in find-file-noselect and insert...
[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. */
24c2a54f 196 dirfilename = ENCODE_FILE (dirfilename);
24c2a54f
RS
197 encoded_directory = ENCODE_FILE (directory);
198
e50c66d3 199 /* Now *bufp is the compiled form of MATCH; don't call anything
6155fae1
JB
200 which might compile a new regexp until we're done with the loop! */
201
d15b573e 202 BLOCK_INPUT;
d5db4077 203 d = opendir (SDATA (dirfilename));
d15b573e 204 UNBLOCK_INPUT;
388ac098 205 if (d == NULL)
23bd240f 206 report_file_error ("Opening directory", Fcons (directory, Qnil));
14d55bce 207
2488aba5
AI
208 /* Unfortunately, we can now invoke expand-file-name and
209 file-attributes on filenames, both of which can throw, so we must
210 do a proper unwind-protect. */
211 record_unwind_protect (directory_files_internal_unwind,
9d291bdf 212 make_save_value (d, 0));
2488aba5 213
d5db4077 214 directory_nbytes = SBYTES (directory);
c81a9bdc 215 re_match_object = Qt;
14d55bce 216
96d64004
AS
217 /* Decide whether we need to add a directory separator. */
218#ifndef VMS
388ac098 219 if (directory_nbytes == 0
d5db4077 220 || !IS_ANY_SEP (SREF (directory, directory_nbytes - 1)))
96d64004 221 needsep = 1;
e540cbed 222#endif /* not VMS */
96d64004 223
8e42f043 224 /* Loop reading blocks until EOF or error. */
f69f9da1 225 for (;;)
14d55bce 226 {
f69f9da1
GM
227 errno = 0;
228 dp = readdir (d);
229
9d291bdf 230 if (dp == NULL && (0
f69f9da1 231#ifdef EAGAIN
9d291bdf
SM
232 || errno == EAGAIN
233#endif
234#ifdef EINTR
235 || errno == EINTR
f69f9da1 236#endif
9d291bdf
SM
237 ))
238 { QUIT; continue; }
177c0ea7 239
f69f9da1
GM
240 if (dp == NULL)
241 break;
242
128ecc89 243 if (DIRENTRY_NONEMPTY (dp))
14d55bce 244 {
e23f810c 245 int len;
2488aba5 246 int wanted = 0;
388ac098
GM
247 Lisp_Object name, finalname;
248 struct gcpro gcpro1, gcpro2;
e23f810c
KH
249
250 len = NAMLEN (dp);
9ad4f3e5 251 name = finalname = make_unibyte_string (dp->d_name, len);
388ac098 252 GCPRO2 (finalname, name);
177c0ea7 253
388ac098
GM
254 /* Note: ENCODE_FILE can GC; it should protect its argument,
255 though. */
256 name = DECODE_FILE (name);
d5db4077 257 len = SBYTES (name);
e23f810c 258
2488aba5
AI
259 /* Now that we have unwind_protect in place, we might as well
260 allow matching to be interrupted. */
261 immediate_quit = 1;
262 QUIT;
263
265a9e55 264 if (NILP (match)
d5db4077 265 || (0 <= re_search (bufp, SDATA (name), len, 0, len, 0)))
388ac098 266 wanted = 1;
2488aba5
AI
267
268 immediate_quit = 0;
269
270 if (wanted)
14d55bce 271 {
265a9e55 272 if (!NILP (full))
14d55bce 273 {
e23f810c 274 Lisp_Object fullname;
388ac098
GM
275 int nbytes = len + directory_nbytes + needsep;
276 int nchars;
5617588f 277
388ac098 278 fullname = make_uninit_multibyte_string (nbytes, nbytes);
d5db4077 279 bcopy (SDATA (directory), SDATA (fullname),
388ac098 280 directory_nbytes);
177c0ea7 281
5617588f 282 if (needsep)
d549c5db 283 SSET (fullname, directory_nbytes, DIRECTORY_SEP);
177c0ea7 284
d5db4077
KR
285 bcopy (SDATA (name),
286 SDATA (fullname) + directory_nbytes + needsep,
388ac098 287 len);
177c0ea7 288
d5db4077 289 nchars = chars_in_text (SDATA (fullname), nbytes);
388ac098
GM
290
291 /* Some bug somewhere. */
292 if (nchars > nbytes)
293 abort ();
177c0ea7 294
437fcd47 295 STRING_SET_CHARS (fullname, nchars);
388ac098 296 if (nchars == nbytes)
d5db4077 297 STRING_SET_UNIBYTE (fullname);
177c0ea7 298
4424b255
GV
299 finalname = fullname;
300 }
aab9c564
KH
301 else
302 finalname = name;
4424b255
GV
303
304 if (attrs)
305 {
306 /* Construct an expanded filename for the directory entry.
307 Use the decoded names for input to Ffile_attributes. */
388ac098
GM
308 Lisp_Object decoded_fullname, fileattrs;
309 struct gcpro gcpro1, gcpro2;
310
311 decoded_fullname = fileattrs = Qnil;
312 GCPRO2 (decoded_fullname, fileattrs);
4424b255 313
388ac098 314 /* Both Fexpand_file_name and Ffile_attributes can GC. */
4424b255 315 decoded_fullname = Fexpand_file_name (name, directory);
6b61353c 316 fileattrs = Ffile_attributes (decoded_fullname, id_format);
4424b255
GV
317
318 list = Fcons (Fcons (finalname, fileattrs), list);
388ac098 319 UNGCPRO;
4424b255
GV
320 }
321 else
388ac098 322 list = Fcons (finalname, list);
14d55bce 323 }
388ac098
GM
324
325 UNGCPRO;
14d55bce
RS
326 }
327 }
2488aba5 328
d15b573e 329 BLOCK_INPUT;
14d55bce 330 closedir (d);
d15b573e 331 UNBLOCK_INPUT;
2488aba5
AI
332
333 /* Discard the unwind protect. */
334 specpdl_ptr = specpdl + count;
335
388ac098
GM
336 if (NILP (nosort))
337 list = Fsort (Fnreverse (list),
338 attrs ? Qfile_attributes_lessp : Qstring_lessp);
177c0ea7 339
388ac098 340 RETURN_UNGCPRO (list);
14d55bce 341}
4424b255
GV
342
343
344DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
335c5470
PJ
345 doc: /* Return a list of names of files in DIRECTORY.
346There are three optional arguments:
347If FULL is non-nil, return absolute file names. Otherwise return names
348 that are relative to the specified directory.
349If MATCH is non-nil, mention only file names that match the regexp MATCH.
350If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
351 NOSORT is useful if you plan to sort the result yourself. */)
352 (directory, full, match, nosort)
4424b255
GV
353 Lisp_Object directory, full, match, nosort;
354{
355 Lisp_Object handler;
4ece81a6 356 directory = Fexpand_file_name (directory, Qnil);
4424b255
GV
357
358 /* If the file name has special constructs in it,
359 call the corresponding file handler. */
360 handler = Ffind_file_name_handler (directory, Qdirectory_files);
361 if (!NILP (handler))
6b61353c
KH
362 return call5 (handler, Qdirectory_files, directory,
363 full, match, nosort);
4424b255 364
6b61353c 365 return directory_files_internal (directory, full, match, nosort, 0, Qnil);
4424b255
GV
366}
367
335c5470 368DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
6b61353c 369 Sdirectory_files_and_attributes, 1, 5, 0,
335c5470 370 doc: /* Return a list of names of files and their attributes in DIRECTORY.
6b61353c 371There are four optional arguments:
335c5470
PJ
372If FULL is non-nil, return absolute file names. Otherwise return names
373 that are relative to the specified directory.
374If MATCH is non-nil, mention only file names that match the regexp MATCH.
375If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
6b61353c
KH
376 NOSORT is useful if you plan to sort the result yourself.
377ID-FORMAT specifies the preferred format of attributes uid and gid, see
378`file-attributes' for further documentation. */)
379 (directory, full, match, nosort, id_format)
380 Lisp_Object directory, full, match, nosort, 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
RS
395\f
396Lisp_Object file_name_completion ();
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. */)
abfb1932
RS
411 (file, directory, predicate)
412 Lisp_Object file, directory, predicate;
14d55bce 413{
32f4334d 414 Lisp_Object handler;
32f4334d 415
8436e231 416 /* If the directory name has special constructs in it,
32f4334d 417 call the corresponding file handler. */
23bd240f 418 handler = Ffind_file_name_handler (directory, Qfile_name_completion);
32f4334d 419 if (!NILP (handler))
abfb1932 420 return call4 (handler, Qfile_name_completion, file, directory, predicate);
32f4334d 421
8436e231
RS
422 /* If the file name has special constructs in it,
423 call the corresponding file handler. */
424 handler = Ffind_file_name_handler (file, Qfile_name_completion);
425 if (!NILP (handler))
abfb1932 426 return call4 (handler, Qfile_name_completion, file, directory, predicate);
8436e231 427
abfb1932 428 return file_name_completion (file, directory, 0, 0, predicate);
14d55bce
RS
429}
430
431DEFUN ("file-name-all-completions", Ffile_name_all_completions,
335c5470
PJ
432 Sfile_name_all_completions, 2, 2, 0,
433 doc: /* Return a list of all completions of file name FILE in directory DIRECTORY.
434These are all file names in directory DIRECTORY which begin with FILE. */)
435 (file, directory)
23bd240f 436 Lisp_Object file, directory;
14d55bce 437{
32f4334d
RS
438 Lisp_Object handler;
439
8436e231 440 /* If the directory name has special constructs in it,
32f4334d 441 call the corresponding file handler. */
23bd240f 442 handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
32f4334d 443 if (!NILP (handler))
23bd240f 444 return call3 (handler, Qfile_name_all_completions, file, directory);
32f4334d 445
8436e231
RS
446 /* If the file name has special constructs in it,
447 call the corresponding file handler. */
448 handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
449 if (!NILP (handler))
23bd240f 450 return call3 (handler, Qfile_name_all_completions, file, directory);
8436e231 451
abfb1932 452 return file_name_completion (file, directory, 1, 0, Qnil);
14d55bce
RS
453}
454
dfcf069d
AS
455static int file_name_completion_stat ();
456
14d55bce 457Lisp_Object
abfb1932 458file_name_completion (file, dirname, all_flag, ver_flag, predicate)
14d55bce
RS
459 Lisp_Object file, dirname;
460 int all_flag, ver_flag;
abfb1932 461 Lisp_Object predicate;
14d55bce
RS
462{
463 DIR *d;
6bbd7a29 464 int bestmatchsize = 0, skip;
14d55bce
RS
465 register int compare, matchsize;
466 unsigned char *p1, *p2;
467 int matchcount = 0;
abfb1932
RS
468 /* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
469 If ALL_FLAG is 0, BESTMATCH is either nil
470 or the best match so far, not decoded. */
14d55bce 471 Lisp_Object bestmatch, tem, elt, name;
24c2a54f
RS
472 Lisp_Object encoded_file;
473 Lisp_Object encoded_dir;
14d55bce
RS
474 struct stat st;
475 int directoryp;
476 int passcount;
aed13378 477 int count = SPECPDL_INDEX ();
24c2a54f 478 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3fcc88cc 479
6bbd7a29
GM
480 elt = Qnil;
481
14d55bce
RS
482#ifdef VMS
483 extern DIRENTRY * readdirver ();
484
485 DIRENTRY *((* readfunc) ());
486
487 /* Filename completion on VMS ignores case, since VMS filesys does. */
488 specbind (Qcompletion_ignore_case, Qt);
489
490 readfunc = readdir;
491 if (ver_flag)
492 readfunc = readdirver;
493 file = Fupcase (file);
494#else /* not VMS */
b7826503 495 CHECK_STRING (file);
14d55bce
RS
496#endif /* not VMS */
497
128ecc89
RS
498#ifdef FILE_SYSTEM_CASE
499 file = FILE_SYSTEM_CASE (file);
500#endif
14d55bce 501 bestmatch = Qnil;
24c2a54f
RS
502 encoded_file = encoded_dir = Qnil;
503 GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
3fcc88cc 504 dirname = Fexpand_file_name (dirname, Qnil);
14d55bce 505
24c2a54f
RS
506 /* Do completion on the encoded file name
507 because the other names in the directory are (we presume)
508 encoded likewise. We decode the completed string at the end. */
509 encoded_file = ENCODE_FILE (file);
510
511 encoded_dir = ENCODE_FILE (dirname);
512
14d55bce
RS
513 /* With passcount = 0, ignore files that end in an ignored extension.
514 If nothing found then try again with passcount = 1, don't ignore them.
515 If looking for all completions, start with passcount = 1,
516 so always take even the ignored ones.
517
518 ** It would not actually be helpful to the user to ignore any possible
519 completions when making a list of them.** */
520
265a9e55 521 for (passcount = !!all_flag; NILP (bestmatch) && passcount < 2; passcount++)
14d55bce 522 {
c3a3229c
RS
523 int inner_count = SPECPDL_INDEX ();
524
d15b573e 525 BLOCK_INPUT;
d5db4077 526 d = opendir (SDATA (Fdirectory_file_name (encoded_dir)));
d15b573e 527 UNBLOCK_INPUT;
24c2a54f 528 if (!d)
14d55bce
RS
529 report_file_error ("Opening directory", Fcons (dirname, Qnil));
530
62e3881f 531 record_unwind_protect (directory_files_internal_unwind,
9d291bdf 532 make_save_value (d, 0));
62e3881f 533
14d55bce
RS
534 /* Loop reading blocks */
535 /* (att3b compiler bug requires do a null comparison this way) */
536 while (1)
537 {
538 DIRENTRY *dp;
539 int len;
540
541#ifdef VMS
542 dp = (*readfunc) (d);
543#else
9d291bdf 544 errno = 0;
14d55bce 545 dp = readdir (d);
9d291bdf
SM
546 if (dp == NULL && (0
547# ifdef EAGAIN
548 || errno == EAGAIN
549# endif
550# ifdef EINTR
551 || errno == EINTR
552# endif
553 ))
554 { QUIT; continue; }
14d55bce 555#endif
9d291bdf 556
14d55bce
RS
557 if (!dp) break;
558
559 len = NAMLEN (dp);
560
c3a3229c 561 QUIT;
128ecc89 562 if (! DIRENTRY_NONEMPTY (dp)
d5db4077
KR
563 || len < SCHARS (encoded_file)
564 || 0 <= scmp (dp->d_name, SDATA (encoded_file),
565 SCHARS (encoded_file)))
14d55bce
RS
566 continue;
567
24c2a54f 568 if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
14d55bce
RS
569 continue;
570
571 directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
572 tem = Qnil;
ad456ad4
RS
573 if (directoryp)
574 {
575#ifndef TRIVIAL_DIRECTORY_ENTRY
576#define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
577#endif
abfb1932
RS
578 /* "." and ".." are never interesting as completions, and are
579 actually in the way in a directory with only one file. */
ad456ad4
RS
580 if (!passcount && TRIVIAL_DIRECTORY_ENTRY (dp->d_name))
581 continue;
d5db4077 582 if (!passcount && len > SCHARS (encoded_file))
d013f29b
EZ
583 /* Ignore directories if they match an element of
584 completion-ignored-extensions which ends in a slash. */
585 for (tem = Vcompletion_ignored_extensions;
586 CONSP (tem); tem = XCDR (tem))
587 {
588 int elt_len;
589
590 elt = XCAR (tem);
591 if (!STRINGP (elt))
592 continue;
a74aaa9d
EZ
593 /* Need to encode ELT, since scmp compares unibyte
594 strings only. */
595 elt = ENCODE_FILE (elt);
d5db4077 596 elt_len = SCHARS (elt) - 1; /* -1 for trailing / */
7a8d465a 597 if (elt_len <= 0)
d013f29b 598 continue;
d5db4077 599 p1 = SDATA (elt);
d013f29b
EZ
600 if (p1[elt_len] != '/')
601 continue;
602 skip = len - elt_len;
603 if (skip < 0)
604 continue;
605
606 if (0 <= scmp (dp->d_name + skip, p1, elt_len))
607 continue;
608 break;
609 }
ad456ad4
RS
610 }
611 else
14d55bce
RS
612 {
613 /* Compare extensions-to-be-ignored against end of this file name */
614 /* if name is not an exact match against specified string */
d5db4077 615 if (!passcount && len > SCHARS (encoded_file))
14d55bce
RS
616 /* and exit this for loop if a match is found */
617 for (tem = Vcompletion_ignored_extensions;
70949dac 618 CONSP (tem); tem = XCDR (tem))
14d55bce 619 {
70949dac 620 elt = XCAR (tem);
88cf1852 621 if (!STRINGP (elt)) continue;
a74aaa9d
EZ
622 /* Need to encode ELT, since scmp compares unibyte
623 strings only. */
624 elt = ENCODE_FILE (elt);
d5db4077 625 skip = len - SCHARS (elt);
14d55bce
RS
626 if (skip < 0) continue;
627
628 if (0 <= scmp (dp->d_name + skip,
d5db4077
KR
629 SDATA (elt),
630 SCHARS (elt)))
14d55bce
RS
631 continue;
632 break;
633 }
634 }
635
f676868d
KH
636 /* If an ignored-extensions match was found,
637 don't process this name as a completion. */
638 if (!passcount && CONSP (tem))
639 continue;
640
641 if (!passcount)
14d55bce 642 {
f676868d
KH
643 Lisp_Object regexps;
644 Lisp_Object zero;
617b3bfe 645 XSETFASTINT (zero, 0);
f676868d
KH
646
647 /* Ignore this element if it fails to match all the regexps. */
648 for (regexps = Vcompletion_regexp_list; CONSP (regexps);
70949dac 649 regexps = XCDR (regexps))
f676868d 650 {
1c56232f
EZ
651 tem = Fstring_match (XCAR (regexps),
652 make_string (dp->d_name, len), zero);
f676868d
KH
653 if (NILP (tem))
654 break;
655 }
656 if (CONSP (regexps))
657 continue;
658 }
14d55bce 659
abfb1932
RS
660 /* This is a possible completion */
661 if (directoryp)
662 {
663 /* This completion is a directory; make it end with '/' */
664 name = Ffile_name_as_directory (make_string (dp->d_name, len));
665 }
666 else
667 name = make_string (dp->d_name, len);
668
669 /* Test the predicate, if any. */
670
671 if (!NILP (predicate))
672 {
673 Lisp_Object decoded;
c4c52bb7
KS
674 Lisp_Object val;
675 struct gcpro gcpro1;
676
677 GCPRO1 (name);
abfb1932 678 decoded = Fexpand_file_name (DECODE_FILE (name), dirname);
c4c52bb7
KS
679 val = call1 (predicate, decoded);
680 UNGCPRO;
681
682 if (NILP (val))
abfb1932
RS
683 continue;
684 }
685
686 /* Suitably record this match. */
14d55bce 687
f676868d
KH
688 matchcount++;
689
abfb1932 690 if (all_flag)
f676868d 691 {
abfb1932
RS
692 name = DECODE_FILE (name);
693 bestmatch = Fcons (name, bestmatch);
694 }
695 else if (NILP (bestmatch))
696 {
697 bestmatch = name;
698 bestmatchsize = SCHARS (name);
f676868d
KH
699 }
700 else
701 {
702 compare = min (bestmatchsize, len);
d5db4077 703 p1 = SDATA (bestmatch);
f676868d 704 p2 = (unsigned char *) dp->d_name;
c4c52bb7 705 matchsize = scmp (p1, p2, compare);
f676868d
KH
706 if (matchsize < 0)
707 matchsize = compare;
708 if (completion_ignore_case)
709 {
710 /* If this is an exact match except for case,
711 use it as the best match rather than one that is not
712 an exact match. This way, we get the case pattern
713 of the actual match. */
f5ec5d3d
RS
714 /* This tests that the current file is an exact match
715 but BESTMATCH is not (it is too long). */
f676868d 716 if ((matchsize == len
177c0ea7 717 && matchsize + !!directoryp
d5db4077 718 < SCHARS (bestmatch))
f676868d
KH
719 ||
720 /* If there is no exact match ignoring case,
721 prefer a match that does not change the case
722 of the input. */
f5ec5d3d
RS
723 /* If there is more than one exact match aside from
724 case, and one of them is exact including case,
725 prefer that one. */
726 /* This == checks that, of current file and BESTMATCH,
727 either both or neither are exact. */
f676868d
KH
728 (((matchsize == len)
729 ==
177c0ea7 730 (matchsize + !!directoryp
d5db4077
KR
731 == SCHARS (bestmatch)))
732 && !bcmp (p2, SDATA (encoded_file), SCHARS (encoded_file))
733 && bcmp (p1, SDATA (encoded_file), SCHARS (encoded_file))))
abfb1932 734 bestmatch = name;
14d55bce 735 }
f676868d
KH
736
737 /* If this dirname all matches, see if implicit following
738 slash does too. */
739 if (directoryp
740 && compare == matchsize
741 && bestmatchsize > matchsize
0b39d75d 742 && IS_ANY_SEP (p1[matchsize]))
f676868d
KH
743 matchsize++;
744 bestmatchsize = matchsize;
14d55bce
RS
745 }
746 }
c3a3229c
RS
747 /* This closes the directory. */
748 bestmatch = unbind_to (inner_count, bestmatch);
14d55bce
RS
749 }
750
3fcc88cc 751 UNGCPRO;
c3a3229c 752 bestmatch = unbind_to (count, bestmatch);
14d55bce 753
265a9e55 754 if (all_flag || NILP (bestmatch))
24c2a54f 755 {
bd33479f
KH
756 if (STRINGP (bestmatch))
757 bestmatch = DECODE_FILE (bestmatch);
24c2a54f
RS
758 return bestmatch;
759 }
d5db4077 760 if (matchcount == 1 && bestmatchsize == SCHARS (file))
14d55bce 761 return Qt;
24c2a54f
RS
762 bestmatch = Fsubstring (bestmatch, make_number (0),
763 make_number (bestmatchsize));
764 /* Now that we got the right initial segment of BESTMATCH,
765 decode it from the coding system in use. */
bd33479f 766 bestmatch = DECODE_FILE (bestmatch);
24c2a54f 767 return bestmatch;
14d55bce
RS
768}
769
b3f04ced
RS
770/* Compare exactly LEN chars of strings at S1 and S2,
771 ignoring case if appropriate.
772 Return -1 if strings match,
773 else number of chars that match at the beginning. */
774
775static int
776scmp (s1, s2, len)
777 register unsigned char *s1, *s2;
778 int len;
779{
780 register int l = len;
781
782 if (completion_ignore_case)
783 {
784 while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
785 l--;
786 }
787 else
788 {
789 while (l && *s1++ == *s2++)
790 l--;
791 }
792 if (l == 0)
793 return -1;
794 else
795 return len - l;
796}
797
dfcf069d 798static int
14d55bce
RS
799file_name_completion_stat (dirname, dp, st_addr)
800 Lisp_Object dirname;
801 DIRENTRY *dp;
802 struct stat *st_addr;
803{
804 int len = NAMLEN (dp);
d5db4077 805 int pos = SCHARS (dirname);
7e3cf34f 806 int value;
14d55bce
RS
807 char *fullname = (char *) alloca (len + pos + 2);
808
04924ee3
RS
809#ifdef MSDOS
810#if __DJGPP__ > 1
811 /* Some fields of struct stat are *very* expensive to compute on MS-DOS,
812 but aren't required here. Avoid computing the following fields:
813 st_inode, st_size and st_nlink for directories, and the execute bits
814 in st_mode for non-directory files with non-standard extensions. */
815
816 unsigned short save_djstat_flags = _djstat_flags;
817
818 _djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
819#endif /* __DJGPP__ > 1 */
820#endif /* MSDOS */
821
d5db4077 822 bcopy (SDATA (dirname), fullname, pos);
14d55bce 823#ifndef VMS
0b39d75d
RS
824 if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
825 fullname[pos++] = DIRECTORY_SEP;
14d55bce
RS
826#endif
827
828 bcopy (dp->d_name, fullname + pos, len);
829 fullname[pos + len] = 0;
830
a889bd0e 831#ifdef S_IFLNK
7e3cf34f
RS
832 /* We want to return success if a link points to a nonexistent file,
833 but we want to return the status for what the link points to,
834 in case it is a directory. */
835 value = lstat (fullname, st_addr);
836 stat (fullname, st_addr);
837 return value;
a889bd0e 838#else
04924ee3
RS
839 value = stat (fullname, st_addr);
840#ifdef MSDOS
841#if __DJGPP__ > 1
842 _djstat_flags = save_djstat_flags;
843#endif /* __DJGPP__ > 1 */
844#endif /* MSDOS */
845 return value;
846#endif /* S_IFLNK */
14d55bce
RS
847}
848\f
3ed991aa
RS
849#ifdef VMS
850
851DEFUN ("file-name-all-versions", Ffile_name_all_versions,
335c5470
PJ
852 Sfile_name_all_versions, 2, 2, 0,
853 doc: /* Return a list of all versions of file name FILE in directory DIRECTORY. */)
854 (file, directory)
23bd240f 855 Lisp_Object file, directory;
3ed991aa 856{
abfb1932 857 return file_name_completion (file, directory, 1, 1, Qnil);
3ed991aa
RS
858}
859
860DEFUN ("file-version-limit", Ffile_version_limit, Sfile_version_limit, 1, 1, 0,
335c5470
PJ
861 doc: /* Return the maximum number of versions allowed for FILE.
862Returns nil if the file cannot be opened or if there is no version limit. */)
863 (filename)
3ed991aa
RS
864 Lisp_Object filename;
865{
866 Lisp_Object retval;
867 struct FAB fab;
868 struct RAB rab;
869 struct XABFHC xabfhc;
870 int status;
871
872 filename = Fexpand_file_name (filename, Qnil);
873 fab = cc$rms_fab;
874 xabfhc = cc$rms_xabfhc;
d5db4077 875 fab.fab$l_fna = SDATA (filename);
3ed991aa
RS
876 fab.fab$b_fns = strlen (fab.fab$l_fna);
877 fab.fab$l_xab = (char *) &xabfhc;
878 status = sys$open (&fab, 0, 0);
879 if (status != RMS$_NORMAL) /* Probably non-existent file */
880 return Qnil;
881 sys$close (&fab, 0, 0);
882 if (xabfhc.xab$w_verlimit == 32767)
883 return Qnil; /* No version limit */
884 else
885 return make_number (xabfhc.xab$w_verlimit);
886}
887
888#endif /* VMS */
889\f
14d55bce
RS
890Lisp_Object
891make_time (time)
e5124be7 892 time_t time;
14d55bce
RS
893{
894 return Fcons (make_number (time >> 16),
895 Fcons (make_number (time & 0177777), Qnil));
896}
897
6b61353c 898DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
335c5470
PJ
899 doc: /* Return a list of attributes of file FILENAME.
900Value is nil if specified file cannot be opened.
6b61353c
KH
901
902ID-FORMAT specifies the preferred format of attributes uid and gid (see
903below) - valid values are 'string and 'integer. The latter is the default,
904but we plan to change that, so you should specify a non-nil value for
905ID-FORMAT if you use the returned uid or gid.
906
907Elements of the attribute list are:
335c5470
PJ
908 0. t for directory, string (name linked to) for symbolic link, or nil.
909 1. Number of links to file.
6b61353c
KH
910 2. File uid as a string or an integer. If a string value cannot be
911 looked up, the integer value is returned.
912 3. File gid, likewise.
335c5470
PJ
913 4. Last access time, as a list of two integers.
914 First integer has high-order 16 bits of time, second has low 16 bits.
915 5. Last modification time, likewise.
916 6. Last status change time, likewise.
917 7. Size in bytes.
918 This is a floating point number if the size is too large for an integer.
919 8. File modes, as a string of ten letters or dashes as in ls -l.
e0f24100 920 9. t if file's gid would change if file were deleted and recreated.
335c5470
PJ
92110. inode number. If inode number is larger than the Emacs integer,
922 this is a cons cell containing two integers: first the high part,
923 then the low 16 bits.
92411. Device number. If it is larger than the Emacs integer, this is
6b61353c
KH
925 a cons cell, similar to the inode number. */)
926 (filename, id_format)
927 Lisp_Object filename, id_format;
14d55bce
RS
928{
929 Lisp_Object values[12];
24c2a54f 930 Lisp_Object encoded;
14d55bce 931 struct stat s;
6b61353c
KH
932 struct passwd *pw;
933 struct group *gr;
0a974c85 934#if defined (BSD4_2) || defined (BSD4_3)
b3edfc9b 935 Lisp_Object dirname;
14d55bce 936 struct stat sdir;
b3edfc9b 937#endif
14d55bce 938 char modes[10];
32f4334d 939 Lisp_Object handler;
7435aef8 940 struct gcpro gcpro1;
345c6b24 941 EMACS_INT uid, gid, ino;
14d55bce
RS
942
943 filename = Fexpand_file_name (filename, Qnil);
32f4334d
RS
944
945 /* If the file name has special constructs in it,
946 call the corresponding file handler. */
a617e913 947 handler = Ffind_file_name_handler (filename, Qfile_attributes);
32f4334d 948 if (!NILP (handler))
6b61353c
KH
949 { /* Only pass the extra arg if it is used to help backward compatibility
950 with old file handlers which do not implement the new arg. --Stef */
951 if (NILP (id_format))
952 return call2 (handler, Qfile_attributes, filename);
953 else
954 return call3 (handler, Qfile_attributes, filename, id_format);
955 }
32f4334d 956
7435aef8 957 GCPRO1 (filename);
24c2a54f 958 encoded = ENCODE_FILE (filename);
7435aef8 959 UNGCPRO;
24c2a54f 960
d5db4077 961 if (lstat (SDATA (encoded), &s) < 0)
14d55bce
RS
962 return Qnil;
963
964 switch (s.st_mode & S_IFMT)
965 {
966 default:
967 values[0] = Qnil; break;
968 case S_IFDIR:
969 values[0] = Qt; break;
970#ifdef S_IFLNK
971 case S_IFLNK:
972 values[0] = Ffile_symlink_p (filename); break;
973#endif
974 }
975 values[1] = make_number (s.st_nlink);
b55445d6
EZ
976 /* When make_fixnum_or_float is called below with types that are
977 shorter than an int (e.g., `short'), GCC whines about comparison
978 being always false due to limited range of data type. Fix by
979 copying s.st_uid and s.st_gid into int variables. */
980 uid = s.st_uid;
981 gid = s.st_gid;
6b61353c
KH
982 if (NILP (id_format) || EQ (id_format, Qinteger))
983 {
b55445d6
EZ
984 values[2] = make_fixnum_or_float (uid);
985 values[3] = make_fixnum_or_float (gid);
6b61353c
KH
986 }
987 else
988 {
8c8a7c58 989 BLOCK_INPUT;
b55445d6 990 pw = (struct passwd *) getpwuid (uid);
8b9ae6b0 991 values[2] = (pw ? build_string (pw->pw_name)
b55445d6
EZ
992 : make_fixnum_or_float (uid));
993 gr = (struct group *) getgrgid (gid);
8b9ae6b0 994 values[3] = (gr ? build_string (gr->gr_name)
b55445d6 995 : make_fixnum_or_float (gid));
8c8a7c58 996 UNBLOCK_INPUT;
6b61353c 997 }
14d55bce
RS
998 values[4] = make_time (s.st_atime);
999 values[5] = make_time (s.st_mtime);
1000 values[6] = make_time (s.st_ctime);
68c45bf0 1001 values[7] = make_number (s.st_size);
cb1846b4 1002 /* If the size is out of range for an integer, return a float. */
60fc6069 1003 if (XINT (values[7]) != s.st_size)
cb1846b4 1004 values[7] = make_float ((double)s.st_size);
4bc12672
JR
1005 /* If the size is negative, and its type is long, convert it back to
1006 positive. */
1007 if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
1008 values[7] = make_float ((double) ((unsigned long) s.st_size));
1009
14d55bce
RS
1010 filemodestring (&s, modes);
1011 values[8] = make_string (modes, 10);
0a974c85 1012#if defined (BSD4_2) || defined (BSD4_3) /* file gid will be dir gid */
14d55bce 1013 dirname = Ffile_name_directory (filename);
24c2a54f
RS
1014 if (! NILP (dirname))
1015 encoded = ENCODE_FILE (dirname);
d5db4077 1016 if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
b55445d6 1017 values[9] = (sdir.st_gid != gid) ? Qt : Qnil;
14d55bce
RS
1018 else /* if we can't tell, assume worst */
1019 values[9] = Qt;
1020#else /* file gid will be egid */
b55445d6 1021 values[9] = (gid != getegid ()) ? Qt : Qnil;
14d55bce 1022#endif /* BSD4_2 (or BSD4_3) */
b55445d6 1023 /* Shut up GCC warnings in FIXNUM_OVERFLOW_P below. */
294f1153
EZ
1024#ifdef WINDOWSNT
1025 {
1026 /* The bit-shuffling we do in w32.c:stat can turn on the MSB, which
1027 will produce negative inode numbers. People don't like that, so
1028 force a positive inode instead. */
1029 unsigned short tem = s.st_ino;
1030 ino = tem;
1031 }
1032#else
b55445d6 1033 ino = s.st_ino;
294f1153 1034#endif
b55445d6 1035 if (FIXNUM_OVERFLOW_P (ino))
4c637faa
RS
1036 /* To allow inode numbers larger than VALBITS, separate the bottom
1037 16 bits. */
b55445d6
EZ
1038 values[10] = Fcons (make_number (ino >> 16),
1039 make_number (ino & 0xffff));
4c637faa
RS
1040 else
1041 /* But keep the most common cases as integers. */
b55445d6 1042 values[10] = make_number (ino);
68c45bf0
PE
1043
1044 /* Likewise for device. */
f8edfd76 1045 if (FIXNUM_OVERFLOW_P (s.st_dev))
68c45bf0
PE
1046 values[11] = Fcons (make_number (s.st_dev >> 16),
1047 make_number (s.st_dev & 0xffff));
1048 else
1049 values[11] = make_number (s.st_dev);
1050
14d55bce
RS
1051 return Flist (sizeof(values) / sizeof(values[0]), values);
1052}
4424b255
GV
1053
1054DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
335c5470
PJ
1055 doc: /* Return t if first arg file attributes list is less than second.
1056Comparison is in lexicographic order and case is significant. */)
1057 (f1, f2)
4424b255
GV
1058 Lisp_Object f1, f2;
1059{
1060 return Fstring_lessp (Fcar (f1), Fcar (f2));
1061}
14d55bce 1062\f
dfcf069d 1063void
14d55bce
RS
1064syms_of_dired ()
1065{
32f4334d 1066 Qdirectory_files = intern ("directory-files");
4424b255 1067 Qdirectory_files_and_attributes = intern ("directory-files-and-attributes");
32f4334d
RS
1068 Qfile_name_completion = intern ("file-name-completion");
1069 Qfile_name_all_completions = intern ("file-name-all-completions");
434e6714 1070 Qfile_attributes = intern ("file-attributes");
4424b255 1071 Qfile_attributes_lessp = intern ("file-attributes-lessp");
32f4334d 1072
a2d3836c 1073 staticpro (&Qdirectory_files);
4424b255 1074 staticpro (&Qdirectory_files_and_attributes);
a2d3836c
EN
1075 staticpro (&Qfile_name_completion);
1076 staticpro (&Qfile_name_all_completions);
1077 staticpro (&Qfile_attributes);
4424b255 1078 staticpro (&Qfile_attributes_lessp);
a2d3836c 1079
14d55bce 1080 defsubr (&Sdirectory_files);
4424b255 1081 defsubr (&Sdirectory_files_and_attributes);
14d55bce
RS
1082 defsubr (&Sfile_name_completion);
1083#ifdef VMS
1084 defsubr (&Sfile_name_all_versions);
3ed991aa 1085 defsubr (&Sfile_version_limit);
14d55bce
RS
1086#endif /* VMS */
1087 defsubr (&Sfile_name_all_completions);
1088 defsubr (&Sfile_attributes);
4424b255 1089 defsubr (&Sfile_attributes_lessp);
14d55bce 1090
14d55bce 1091 DEFVAR_LISP ("completion-ignored-extensions", &Vcompletion_ignored_extensions,
407a52c4
LT
1092 doc: /* Completion ignores file names ending in any string in this list.
1093It does not ignore them if all possible completions end in one of
1094these strings or when displaying a list of completions.
1095It ignores directory names if they match any string in this list which
1096ends in a slash. */);
14d55bce
RS
1097 Vcompletion_ignored_extensions = Qnil;
1098}
6b61353c
KH
1099
1100/* arch-tag: 1ac8deca-4d8f-4d41-ade9-089154d98c03
1101 (do not change this comment) */