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