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