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