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