* chartab.c (ASET_RANGE, GET_SUB_CHAR_TABLE): Remove unused macros.
[bpt/emacs.git] / src / dired.c
index d72ea54..9606368 100644 (file)
@@ -1,6 +1,5 @@
 /* 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.
 
@@ -31,10 +30,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #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
@@ -65,6 +61,8 @@ extern struct direct *readdir (DIR *);
 
 #endif /* HAVE_DIRENT_H */
 
+#include <filemode.h>
+
 #ifdef MSDOS
 #define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
 #else
@@ -86,19 +84,6 @@ extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
                                                  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;
@@ -106,7 +91,7 @@ Lisp_Object Qfile_name_all_completions;
 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
@@ -165,7 +150,7 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object m
 # 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 */
@@ -183,7 +168,7 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object m
      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));
@@ -265,7 +250,7 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object m
          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;
@@ -505,7 +490,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
   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));
@@ -540,14 +525,14 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
       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
@@ -565,7 +550,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
              && 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
 
@@ -585,7 +570,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
                     CONSP (tem); tem = XCDR (tem))
                  {
                    int elt_len;
-                   unsigned char *p1;
+                   char *p1;
 
                    elt = XCAR (tem);
                    if (!STRINGP (elt))
@@ -596,7 +581,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
                    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;
@@ -626,7 +611,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
                    if (skip < 0) continue;
 
                    if (0 <= scmp (dp->d_name + skip,
-                                  SDATA (elt),
+                                  SSDATA (elt),
                                   SCHARS (elt)))
                      continue;
                    break;
@@ -803,13 +788,15 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int v
    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
@@ -849,20 +836,16 @@ file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_ad
   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
@@ -954,7 +937,11 @@ so last access time will always be midnight of that day.  */)
   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;
@@ -977,20 +964,11 @@ so last access time will always be midnight of that day.  */)
   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)))
@@ -1098,7 +1076,7 @@ syms_of_dired (void)
   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.
@@ -1106,6 +1084,3 @@ It ignores directory names if they match any string in this list which
 ends in a slash.  */);
   Vcompletion_ignored_extensions = Qnil;
 }
-
-/* arch-tag: 1ac8deca-4d8f-4d41-ade9-089154d98c03
-   (do not change this comment) */