/* Lisp functions for making directory listings.
- Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1985-1986, 1993-1994, 1999-2011 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <grp.h>
#include <errno.h>
-
-#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#endif
/* The d_nameln member of a struct dirent includes the '\0' character
on some systems, but not on others. What's worse, you can't tell
#endif /* HAVE_DIRENT_H */
+#include <filemode.h>
+
#ifdef MSDOS
#define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
#else
struct re_registers *,
Lisp_Object, int, int);
-/* From filemode.c. Can't go in Lisp.h because of `stat'. */
-extern void filemodestring (struct stat *, char *);
-
-/* if system does not have symbolic links, it does not have lstat.
- In that case, use ordinary stat instead. */
-
-#ifndef S_IFLNK
-#define lstat stat
-#endif
-
-extern Lisp_Object Vw32_get_true_file_attributes;
-
-Lisp_Object Vcompletion_ignored_extensions;
Lisp_Object Qdirectory_files;
Lisp_Object Qdirectory_files_and_attributes;
Lisp_Object Qfile_name_completion;
Lisp_Object Qfile_attributes;
Lisp_Object Qfile_attributes_lessp;
-static int scmp (const unsigned char *, const unsigned char *, int);
+static int scmp (const char *, const char *, int);
\f
#ifdef WINDOWSNT
Lisp_Object
# ifdef WINDOWSNT
/* Windows users want case-insensitive wildcards. */
bufp = compile_pattern (match, 0,
- buffer_defaults.case_canon_table, 0, 1);
+ BVAR (&buffer_defaults, case_canon_table), 0, 1);
# else /* !WINDOWSNT */
bufp = compile_pattern (match, 0, Qnil, 0, 1);
# endif /* !WINDOWSNT */
which might compile a new regexp until we're done with the loop! */
BLOCK_INPUT;
- d = opendir (SDATA (dirfilename));
+ d = opendir (SSDATA (dirfilename));
UNBLOCK_INPUT;
if (d == NULL)
report_file_error ("Opening directory", Fcons (directory, Qnil));
QUIT;
if (NILP (match)
- || (0 <= re_search (bufp, SDATA (name), len, 0, len, 0)))
+ || (0 <= re_search (bufp, SSDATA (name), len, 0, len, 0)))
wanted = 1;
immediate_quit = 0;
encoded_dir = ENCODE_FILE (dirname);
BLOCK_INPUT;
- d = opendir (SDATA (Fdirectory_file_name (encoded_dir)));
+ d = opendir (SSDATA (Fdirectory_file_name (encoded_dir)));
UNBLOCK_INPUT;
if (!d)
report_file_error ("Opening directory", Fcons (dirname, Qnil));
QUIT;
if (! DIRENTRY_NONEMPTY (dp)
|| len < SCHARS (encoded_file)
- || 0 <= scmp (dp->d_name, SDATA (encoded_file),
+ || 0 <= scmp (dp->d_name, SSDATA (encoded_file),
SCHARS (encoded_file)))
continue;
if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
continue;
- directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
+ directoryp = S_ISDIR (st.st_mode);
tem = Qnil;
/* If all_flag is set, always include all.
It would not actually be helpful to the user to ignore any possible
&& matchcount > 1
&& !includeall /* This match may allow includeall to 0. */
&& len >= bestmatchsize
- && 0 > scmp (dp->d_name, SDATA (bestmatch), bestmatchsize))
+ && 0 > scmp (dp->d_name, SSDATA (bestmatch), bestmatchsize))
continue;
#endif
CONSP (tem); tem = XCDR (tem))
{
int elt_len;
- unsigned char *p1;
+ char *p1;
elt = XCAR (tem);
if (!STRINGP (elt))
elt_len = SCHARS (elt) - 1; /* -1 for trailing / */
if (elt_len <= 0)
continue;
- p1 = SDATA (elt);
+ p1 = SSDATA (elt);
if (p1[elt_len] != '/')
continue;
skip = len - elt_len;
if (skip < 0) continue;
if (0 <= scmp (dp->d_name + skip,
- SDATA (elt),
+ SSDATA (elt),
SCHARS (elt)))
continue;
break;
else number of chars that match at the beginning. */
static int
-scmp (const unsigned char *s1, const unsigned char *s2, int len)
+scmp (const char *s1, const char *s2, int len)
{
register int l = len;
if (completion_ignore_case)
{
- while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
+ while (l
+ && (DOWNCASE ((unsigned char) *s1++)
+ == DOWNCASE ((unsigned char) *s2++)))
l--;
}
else
memcpy (fullname + pos, dp->d_name, len);
fullname[pos + len] = 0;
-#ifdef S_IFLNK
/* We want to return success if a link points to a nonexistent file,
but we want to return the status for what the link points to,
in case it is a directory. */
value = lstat (fullname, st_addr);
- stat (fullname, st_addr);
- return value;
-#else
- value = stat (fullname, st_addr);
+ if (value == 0 && S_ISLNK (st_addr->st_mode))
+ stat (fullname, st_addr);
#ifdef MSDOS
_djstat_flags = save_djstat_flags;
#endif /* MSDOS */
return value;
-#endif /* S_IFLNK */
}
\f
Lisp_Object
Lisp_Object dirname;
struct stat sdir;
#endif /* BSD4_2 */
- char modes[10];
+
+ /* An array to hold the mode string generated by filemodestring,
+ including its terminating space and null byte. */
+ char modes[sizeof "-rwxr-xr-x "];
+
Lisp_Object handler;
struct gcpro gcpro1;
char *uname = NULL, *gname = NULL;
encoded = ENCODE_FILE (filename);
UNGCPRO;
- if (lstat (SDATA (encoded), &s) < 0)
+ if (lstat (SSDATA (encoded), &s) < 0)
return Qnil;
- switch (s.st_mode & S_IFMT)
- {
- default:
- values[0] = Qnil; break;
- case S_IFDIR:
- values[0] = Qt; break;
-#ifdef S_IFLNK
- case S_IFLNK:
- values[0] = Ffile_symlink_p (filename); break;
-#endif
- }
+ values[0] = (S_ISLNK (s.st_mode) ? Ffile_symlink_p (filename)
+ : S_ISDIR (s.st_mode) ? Qt : Qnil);
values[1] = make_number (s.st_nlink);
if (!(NILP (id_format) || EQ (id_format, Qinteger)))
defsubr (&Sfile_attributes);
defsubr (&Sfile_attributes_lessp);
- DEFVAR_LISP ("completion-ignored-extensions", &Vcompletion_ignored_extensions,
+ DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
doc: /* Completion ignores file names ending in any string in this list.
It does not ignore them if all possible completions end in one of
these strings or when displaying a list of completions.
ends in a slash. */);
Vcompletion_ignored_extensions = Qnil;
}
-
-/* arch-tag: 1ac8deca-4d8f-4d41-ade9-089154d98c03
- (do not change this comment) */