]> code.delx.au - gnu-emacs/blobdiff - src/dired.c
* src/macfont.m (mac_font_descriptor_supports_languages): Regard "zh" as synonym...
[gnu-emacs] / src / dired.c
index 56d6de2d3522310cb9b670438704f9a0e3309d83..97736673f5d5aefa6f76a59b24e241a6ed7171a4 100644 (file)
@@ -124,11 +124,10 @@ directory_files_internal_unwind (void *dh)
 
 /* Return the next directory entry from DIR; DIR's name is DIRNAME.
    If there are no more directory entries, return a null pointer.
-   Signal any unrecoverable errors.  FIRST_ENTRY true means this is
-   the first call after open_directory.  */
+   Signal any unrecoverable errors.  */
 
 static struct dirent *
-read_dirent (DIR *dir, Lisp_Object dirname, bool first_entry)
+read_dirent (DIR *dir, Lisp_Object dirname)
 {
   while (true)
     {
@@ -138,14 +137,15 @@ read_dirent (DIR *dir, Lisp_Object dirname, bool first_entry)
        return dp;
       if (! (errno == EAGAIN || errno == EINTR))
        {
+#ifdef WINDOWSNT
          /* The MS-Windows implementation of 'opendir' doesn't
             actually open a directory until the first call to
             'readdir'.  If 'readdir' fails to open the directory, it
             sets errno to ENOENT or EACCES, see w32.c.  */
-         if (first_entry && (errno == ENOENT || errno == EACCES))
+         if (errno == ENOENT || errno == EACCES)
            report_file_error ("Opening directory", dirname);
-         else
-           report_file_error ("Reading directory", dirname);
+#endif
+         report_file_error ("Reading directory", dirname);
        }
       QUIT;
     }
@@ -166,21 +166,17 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full,
   struct re_pattern_buffer *bufp = NULL;
   bool needsep = 0;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
 #ifdef WINDOWSNT
   Lisp_Object w32_save = Qnil;
 #endif
 
   /* Don't let the compiler optimize away all copies of DIRECTORY,
-     which would break GC; see Bug#16986.  Although this is required
-     only in the common case where GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS,
-     it shouldn't break anything in the other cases.  */
+     which would break GC; see Bug#16986.  */
   Lisp_Object volatile directory_volatile = directory;
 
   /* Because of file name handlers, these functions might call
      Ffuncall, and cause a GC.  */
   list = encoded_directory = dirfilename = Qnil;
-  GCPRO5 (match, directory, list, dirfilename, encoded_directory);
   dirfilename = Fdirectory_file_name (directory);
 
   if (!NILP (match))
@@ -249,16 +245,11 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full,
     needsep = 1;
 
   /* Loop reading directory entries.  */
-  bool first_entry = true;
-  for (struct dirent *dp; (dp = read_dirent (d, directory, first_entry)); )
+  for (struct dirent *dp; (dp = read_dirent (d, directory)); )
     {
       ptrdiff_t len = dirent_namelen (dp);
       Lisp_Object name = make_unibyte_string (dp->d_name, len);
       Lisp_Object finalname = name;
-      struct gcpro gcpro1, gcpro2;
-      GCPRO2 (finalname, name);
-
-      first_entry = false;
 
       /* Note: DECODE_FILE can GC; it should protect its argument,
         though.  */
@@ -317,8 +308,6 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full,
          else
            list = Fcons (finalname, list);
        }
-
-      UNGCPRO;
     }
 
   block_input ();
@@ -337,7 +326,7 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full,
                  attrs ? Qfile_attributes_lessp : Qstring_lessp);
 
   (void) directory_volatile;
-  RETURN_UNGCPRO (list);
+  return list;
 }
 
 
@@ -475,7 +464,6 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag,
      anything.  */
   bool includeall = 1;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
 
   elt = Qnil;
 
@@ -483,7 +471,6 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag,
 
   bestmatch = Qnil;
   encoded_file = encoded_dir = Qnil;
-  GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
   specbind (Qdefault_directory, dirname);
 
   /* Do completion on the encoded file name
@@ -499,13 +486,11 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag,
   record_unwind_protect_ptr (directory_files_internal_unwind, d);
 
   /* Loop reading directory entries.  */
-  bool first_entry = true;
-  for (struct dirent *dp; (dp = read_dirent (d, dirname, first_entry)); )
+  for (struct dirent *dp; (dp = read_dirent (d, dirname)); )
     {
       ptrdiff_t len = dirent_namelen (dp);
       bool canexclude = 0;
 
-      first_entry = false;
       QUIT;
       if (len < SCHARS (encoded_file)
          || (scmp (dp->d_name, SSDATA (encoded_file),
@@ -645,18 +630,8 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag,
        name = Ffile_name_as_directory (name);
 
       /* Test the predicate, if any.  */
-      if (!NILP (predicate))
-       {
-         Lisp_Object val;
-         struct gcpro gcpro1;
-
-         GCPRO1 (name);
-         val = call1 (predicate, name);
-         UNGCPRO;
-
-         if (NILP (val))
-           continue;
-       }
+      if (!NILP (predicate) && NILP (call1 (predicate, name)))
+       continue;
 
       /* Suitably record this match.  */
 
@@ -736,7 +711,6 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag,
        }
     }
 
-  UNGCPRO;
   /* This closes the directory.  */
   bestmatch = unbind_to (count, bestmatch);
 
@@ -842,7 +816,7 @@ DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
 Value is nil if specified file cannot be opened.
 
 ID-FORMAT specifies the preferred format of attributes uid and gid (see
-below) - valid values are 'string and 'integer.  The latter is the
+below) - valid values are `string' and `integer'.  The latter is the
 default, but we plan to change that, so you should specify a non-nil value
 for ID-FORMAT if you use the returned uid or gid.