emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r110986: Assume POSIX 1003.1-1988 or


From: Paul Eggert
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r110986: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Thu, 22 Nov 2012 23:48:43 -0800
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 110986
fixes bug: http://debbugs.gnu.org/12958
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Thu 2012-11-22 23:48:43 -0800
message:
  Assume POSIX 1003.1-1988 or later for dirent.h.
  
  * admin/CPP-DEFINES (HAVE_CLOSEDIR, HAVE_DIRENT_H): Remove.
  * admin/notes/copyright: Adjust to src/ndir.h -> nt/inc/dirent.h renaming.
  * configure.ac: Do not check for dirent.h or closdir.
  * nt/inc/dirent.h: Rename from ../src/ndir.h, with these changes:
  (struct dirent): Rename from struct direct.  All uses changed.
  * nt/inc/sys/dir.h: Remove.
  * src/dired.c: Assume HAVE_DIRENT_H.
  (NAMLEN): Remove, replacing with ...
  (dirent_namelen): New function.  All uses changed.  Use the GNU macro
  _D_EXACT_NAMELEN if available, as it's faster than strlen.
  (DIRENTRY): Remove, replacing all uses with 'struct dirent'.
  (DIRENTRY_NONEMPTY): Remove.  All callers now assume it's nonzero.
  * src/makefile.w32-in (DIR_H): Remove.  All uses replaced with
  $(NT_INC)/dirent.h.
  ($(BLD)/w32.$(O)): Do not depend on $(SRC)/ndir.h.
  * src/ndir.h: Rename to ../nt/inc/dirent.h.
  * src/sysdep.h (closedir) [!HAVE_CLOSEDIR]: Remove.
  Do not include <dirent.h>; no longer needed.
  * src/w32.c: Include <dirent.h> rather than "ndir.h".
removed:
  nt/inc/sys/dir.h
renamed:
  src/ndir.h => nt/inc/dirent.h
modified:
  ChangeLog
  admin/CPP-DEFINES
  admin/ChangeLog
  admin/notes/copyright
  configure.ac
  nt/ChangeLog
  src/ChangeLog
  src/dired.c
  src/makefile.w32-in
  src/sysdep.c
  src/w32.c
  nt/inc/dirent.h
=== modified file 'ChangeLog'
--- a/ChangeLog 2012-11-21 21:06:52 +0000
+++ b/ChangeLog 2012-11-23 07:48:43 +0000
@@ -1,3 +1,8 @@
+2012-11-23  Paul Eggert  <address@hidden>
+
+       Assume POSIX 1003.1-1988 or later for dirent.h (Bug#12958).
+       * configure.ac: Do not check for dirent.h or closdir.
+
 2012-11-21  Paul Eggert  <address@hidden>
 
        Assume POSIX 1003.1-1988 or later for unistd.h (Bug#12945).

=== modified file 'admin/CPP-DEFINES'
--- a/admin/CPP-DEFINES 2012-11-21 21:06:52 +0000
+++ b/admin/CPP-DEFINES 2012-11-23 07:48:43 +0000
@@ -118,7 +118,6 @@
 HAVE_CFSETSPEED
 HAVE_CLOCK_GETTIME
 HAVE_CLOCK_SETTIME
-HAVE_CLOSEDIR
 HAVE_COFF_H
 HAVE_COM_ERR_H
 HAVE_COPYSIGN
@@ -143,7 +142,6 @@
 HAVE_DEV_PTMX
 HAVE_DIALOGS
 HAVE_DIFFTIME
-HAVE_DIRENT_H
 HAVE_DUP2
 HAVE_ENDGRENT
 HAVE_ENDPWENT

=== modified file 'admin/ChangeLog'
--- a/admin/ChangeLog   2012-11-21 21:06:52 +0000
+++ b/admin/ChangeLog   2012-11-23 07:48:43 +0000
@@ -1,3 +1,9 @@
+2012-11-23  Paul Eggert  <address@hidden>
+
+       Assume POSIX 1003.1-1988 or later for dirent.h (Bug#12958).
+       * CPP-DEFINES (HAVE_CLOSEDIR, HAVE_DIRENT_H): Remove.
+       * notes/copyright: Adjust to src/ndir.h -> nt/inc/dirent.h renaming.
+
 2012-11-21  Paul Eggert  <address@hidden>
 
        Assume POSIX 1003.1-1988 or later for unistd.h (Bug#12945).

=== modified file 'admin/notes/copyright'
--- a/admin/notes/copyright     2012-01-19 07:21:25 +0000
+++ b/admin/notes/copyright     2012-11-23 07:48:43 +0000
@@ -380,7 +380,7 @@
 src/gmalloc.c
   - contains numerous copyrights from the GNU C library. Leave them alone.
 
-src/ndir.h
+nt/inc/dirent.h
   - see comments below. This file is OK to be released with Emacs
   22, but we may want to revisit it afterwards.
 
@@ -429,7 +429,7 @@
   File says it's in the public domain, but that might not make it so.
 
 etc/e/eterm-color.ti
-src/ndir.h
+nt/inc/dirent.h
   On legal advice from Matt Norwood, the following comment was added
   to these files in Feb/Mar 2007:
 

=== modified file 'configure.ac'
--- a/configure.ac      2012-11-21 21:06:52 +0000
+++ b/configure.ac      2012-11-23 07:48:43 +0000
@@ -1289,7 +1289,7 @@
   linux/version.h sys/systeminfo.h
   coff.h pty.h
   sys/vlimit.h sys/resource.h
-  sys/utsname.h pwd.h utmp.h dirent.h util.h)
+  sys/utsname.h pwd.h utmp.h util.h)
 
 AC_MSG_CHECKING(if personality LINUX32 can be set)
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/personality.h>]], 
[[personality (PER_LINUX32)]])],
@@ -2891,7 +2891,7 @@
 
 
 AC_CHECK_FUNCS(gethostname \
-closedir getrusage get_current_dir_name \
+getrusage get_current_dir_name \
 lrand48 \
 select getpagesize setlocale \
 utimes getrlimit setrlimit shutdown getaddrinfo \

=== modified file 'nt/ChangeLog'
--- a/nt/ChangeLog      2012-11-21 21:06:52 +0000
+++ b/nt/ChangeLog      2012-11-23 07:48:43 +0000
@@ -1,3 +1,10 @@
+2012-11-23  Paul Eggert  <address@hidden>
+
+       Assume POSIX 1003.1-1988 or later for dirent.h (Bug#12958).
+       * inc/dirent.h: Rename from ../src/ndir.h, with these changes:
+       (struct dirent): Rename from struct direct.  All uses changed.
+       * inc/sys/dir.h: Remove.
+
 2012-11-21  Paul Eggert  <address@hidden>
 
        Assume POSIX 1003.1-1988 or later for unistd.h (Bug#12945).

=== renamed file 'src/ndir.h' => 'nt/inc/dirent.h'
--- a/src/ndir.h        2011-01-15 23:16:57 +0000
+++ b/nt/inc/dirent.h   2012-11-23 07:48:43 +0000
@@ -1,7 +1,5 @@
 /*
-       <dir.h> -- definitions for 4.2BSD-compatible directory access
-
-       last edit:      09-Jul-1983     D A Gwyn
+       <dirent.h> -- definitions for POSIX-compatible directory access
 
  * The code here is forced by the interface, and is not subject to
  * copyright, constituting the only possible expression of the
@@ -16,7 +14,7 @@
 #endif /* not WINDOWSNT */
        /* NOTE:  MAXNAMLEN must be one less than a multiple of 4 */
 
-struct direct                          /* data from readdir() */
+struct dirent                          /* data from readdir() */
        {
        long            d_ino;          /* inode number of entry */
        unsigned short  d_reclen;       /* length of this record */
@@ -33,9 +31,8 @@
        }       DIR;                    /* stream data from opendir() */
 
 extern DIR             *opendir (char *);
-extern struct direct   *readdir (DIR *);
+extern struct dirent   *readdir (DIR *);
 extern void            seekdir (DIR *, long);
 extern void            closedir (DIR *);
 
 #define rewinddir( dirp )      seekdir( dirp, 0L )
-

=== removed file 'nt/inc/sys/dir.h'
--- a/nt/inc/sys/dir.h  2011-01-15 23:16:57 +0000
+++ b/nt/inc/sys/dir.h  1970-01-01 00:00:00 +0000
@@ -1,6 +0,0 @@
-/*
- * map sys\dir.h to ..\..\..\src\ndir.h
- */
-
-#include "..\..\..\src\ndir.h"
-

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2012-11-23 06:23:28 +0000
+++ b/src/ChangeLog     2012-11-23 07:48:43 +0000
@@ -1,3 +1,20 @@
+2012-11-23  Paul Eggert  <address@hidden>
+
+       Assume POSIX 1003.1-1988 or later for dirent.h (Bug#12958).
+       * dired.c: Assume HAVE_DIRENT_H.
+       (NAMLEN): Remove, replacing with ...
+       (dirent_namelen): New function.  All uses changed.  Use the GNU macro
+       _D_EXACT_NAMELEN if available, as it's faster than strlen.
+       (DIRENTRY): Remove, replacing all uses with 'struct dirent'.
+       (DIRENTRY_NONEMPTY): Remove.  All callers now assume it's nonzero.
+       * makefile.w32-in (DIR_H): Remove.  All uses replaced with
+       $(NT_INC)/dirent.h.
+       ($(BLD)/w32.$(O)): Do not depend on $(SRC)/ndir.h.
+       * ndir.h: Rename to ../nt/inc/dirent.h.
+       * sysdep.h (closedir) [!HAVE_CLOSEDIR]: Remove.
+       Do not include <dirent.h>; no longer needed.
+       * w32.c: Include <dirent.h> rather than "ndir.h".
+
 2012-11-23  Chong Yidong  <address@hidden>
 
        * xftfont.c (xftfont_open): Remove duplicate assignment.

=== modified file 'src/dired.c'
--- a/src/dired.c       2012-10-01 02:07:14 +0000
+++ b/src/dired.c       2012-11-23 07:48:43 +0000
@@ -31,44 +31,10 @@
 #include <errno.h>
 #include <unistd.h>
 
-/* 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
-   at compile-time which one it will be, since it really depends on
-   the sort of system providing the filesystem you're reading from,
-   not the system you are running on.  Paul Eggert
-   <address@hidden> says this occurs when Emacs is running on a
-   SunOS 4.1.2 host, reading a directory that is remote-mounted from a
-   Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
-
-   Since applying strlen to the name always works, we'll just do that.  */
-#define NAMLEN(p) strlen (p->d_name)
-
-#ifdef HAVE_DIRENT_H
-
 #include <dirent.h>
-#define DIRENTRY struct dirent
-
-#else /* not HAVE_DIRENT_H */
-
-#include <sys/dir.h>
-#include <sys/stat.h>
-
-#define DIRENTRY struct direct
-
-extern DIR *opendir (char *);
-extern struct direct *readdir (DIR *);
-
-#endif /* HAVE_DIRENT_H */
-
 #include <filemode.h>
 #include <stat-time.h>
 
-#ifdef MSDOS
-#define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
-#else
-#define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
-#endif
-
 #include "lisp.h"
 #include "systime.h"
 #include "character.h"
@@ -88,6 +54,17 @@
 
 static ptrdiff_t scmp (const char *, const char *, ptrdiff_t);
 
+/* Return the number of bytes in DP's name.  */
+static ptrdiff_t
+dirent_namelen (struct dirent *dp)
+{
+#ifdef _D_EXACT_NAMLEN
+  return _D_EXACT_NAMLEN (dp);
+#else
+  return strlen (dp->d_name);
+#endif
+}
+
 #ifdef WINDOWSNT
 Lisp_Object
 directory_files_internal_w32_unwind (Lisp_Object arg)
@@ -124,7 +101,7 @@
   bool needsep = 0;
   ptrdiff_t count = SPECPDL_INDEX ();
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
-  DIRENTRY *dp;
+  struct dirent *dp;
 #ifdef WINDOWSNT
   Lisp_Object w32_save = Qnil;
 #endif
@@ -209,6 +186,11 @@
   /* Loop reading blocks until EOF or error.  */
   for (;;)
     {
+      ptrdiff_t len;
+      bool wanted = 0;
+      Lisp_Object name, finalname;
+      struct gcpro gcpro1, gcpro2;
+
       errno = 0;
       dp = readdir (d);
 
@@ -225,89 +207,81 @@
       if (dp == NULL)
        break;
 
-      if (DIRENTRY_NONEMPTY (dp))
+      len = dirent_namelen (dp);
+      name = finalname = make_unibyte_string (dp->d_name, len);
+      GCPRO2 (finalname, name);
+
+      /* Note: DECODE_FILE can GC; it should protect its argument,
+        though.  */
+      name = DECODE_FILE (name);
+      len = SBYTES (name);
+
+      /* Now that we have unwind_protect in place, we might as well
+        allow matching to be interrupted.  */
+      immediate_quit = 1;
+      QUIT;
+
+      if (NILP (match)
+         || (0 <= re_search (bufp, SSDATA (name), len, 0, len, 0)))
+       wanted = 1;
+
+      immediate_quit = 0;
+
+      if (wanted)
        {
-         ptrdiff_t len;
-         bool wanted = 0;
-         Lisp_Object name, finalname;
-         struct gcpro gcpro1, gcpro2;
-
-         len = NAMLEN (dp);
-         name = finalname = make_unibyte_string (dp->d_name, len);
-         GCPRO2 (finalname, name);
-
-         /* Note: DECODE_FILE can GC; it should protect its argument,
-            though.  */
-         name = DECODE_FILE (name);
-         len = SBYTES (name);
-
-         /* Now that we have unwind_protect in place, we might as well
-             allow matching to be interrupted.  */
-         immediate_quit = 1;
-         QUIT;
-
-         if (NILP (match)
-             || (0 <= re_search (bufp, SSDATA (name), len, 0, len, 0)))
-           wanted = 1;
-
-         immediate_quit = 0;
-
-         if (wanted)
-           {
-             if (!NILP (full))
-               {
-                 Lisp_Object fullname;
-                 ptrdiff_t nbytes = len + directory_nbytes + needsep;
-                 ptrdiff_t nchars;
-
-                 fullname = make_uninit_multibyte_string (nbytes, nbytes);
-                 memcpy (SDATA (fullname), SDATA (directory),
-                         directory_nbytes);
-
-                 if (needsep)
-                   SSET (fullname, directory_nbytes, DIRECTORY_SEP);
-
-                 memcpy (SDATA (fullname) + directory_nbytes + needsep,
-                         SDATA (name), len);
-
-                 nchars = chars_in_text (SDATA (fullname), nbytes);
-
-                 /* Some bug somewhere.  */
-                 if (nchars > nbytes)
-                   emacs_abort ();
-
-                 STRING_SET_CHARS (fullname, nchars);
-                 if (nchars == nbytes)
-                   STRING_SET_UNIBYTE (fullname);
-
-                 finalname = fullname;
-               }
-             else
-               finalname = name;
-
-             if (attrs)
-               {
-                 /* Construct an expanded filename for the directory entry.
-                    Use the decoded names for input to Ffile_attributes.  */
-                 Lisp_Object decoded_fullname, fileattrs;
-                 struct gcpro gcpro1, gcpro2;
-
-                 decoded_fullname = fileattrs = Qnil;
-                 GCPRO2 (decoded_fullname, fileattrs);
-
-                 /* Both Fexpand_file_name and Ffile_attributes can GC.  */
-                 decoded_fullname = Fexpand_file_name (name, directory);
-                 fileattrs = Ffile_attributes (decoded_fullname, id_format);
-
-                 list = Fcons (Fcons (finalname, fileattrs), list);
-                 UNGCPRO;
-               }
-             else
-               list = Fcons (finalname, list);
-           }
-
-         UNGCPRO;
+         if (!NILP (full))
+           {
+             Lisp_Object fullname;
+             ptrdiff_t nbytes = len + directory_nbytes + needsep;
+             ptrdiff_t nchars;
+
+             fullname = make_uninit_multibyte_string (nbytes, nbytes);
+             memcpy (SDATA (fullname), SDATA (directory),
+                     directory_nbytes);
+
+             if (needsep)
+               SSET (fullname, directory_nbytes, DIRECTORY_SEP);
+
+             memcpy (SDATA (fullname) + directory_nbytes + needsep,
+                     SDATA (name), len);
+
+             nchars = chars_in_text (SDATA (fullname), nbytes);
+
+             /* Some bug somewhere.  */
+             if (nchars > nbytes)
+               emacs_abort ();
+
+             STRING_SET_CHARS (fullname, nchars);
+             if (nchars == nbytes)
+               STRING_SET_UNIBYTE (fullname);
+
+             finalname = fullname;
+           }
+         else
+           finalname = name;
+
+         if (attrs)
+           {
+             /* Construct an expanded filename for the directory entry.
+                Use the decoded names for input to Ffile_attributes.  */
+             Lisp_Object decoded_fullname, fileattrs;
+             struct gcpro gcpro1, gcpro2;
+
+             decoded_fullname = fileattrs = Qnil;
+             GCPRO2 (decoded_fullname, fileattrs);
+
+             /* Both Fexpand_file_name and Ffile_attributes can GC.  */
+             decoded_fullname = Fexpand_file_name (name, directory);
+             fileattrs = Ffile_attributes (decoded_fullname, id_format);
+
+             list = Fcons (Fcons (finalname, fileattrs), list);
+             UNGCPRO;
+           }
+         else
+           list = Fcons (finalname, list);
        }
+
+      UNGCPRO;
     }
 
   block_input ();
@@ -442,7 +416,8 @@
   return file_name_completion (file, directory, 1, Qnil);
 }
 
-static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, 
struct stat *st_addr);
+static int file_name_completion_stat (Lisp_Object dirname, struct dirent *dp,
+                                     struct stat *st_addr);
 static Lisp_Object Qdefault_directory;
 
 static Lisp_Object
@@ -499,7 +474,7 @@
   /* (att3b compiler bug requires do a null comparison this way) */
   while (1)
     {
-      DIRENTRY *dp;
+      struct dirent *dp;
       ptrdiff_t len;
       bool canexclude = 0;
 
@@ -517,11 +492,10 @@
 
       if (!dp) break;
 
-      len = NAMLEN (dp);
+      len = dirent_namelen (dp);
 
       QUIT;
-      if (! DIRENTRY_NONEMPTY (dp)
-         || len < SCHARS (encoded_file)
+      if (len < SCHARS (encoded_file)
          || 0 <= scmp (dp->d_name, SSDATA (encoded_file),
                        SCHARS (encoded_file)))
        continue;
@@ -806,9 +780,10 @@
 }
 
 static int
-file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat 
*st_addr)
+file_name_completion_stat (Lisp_Object dirname, struct dirent *dp,
+                          struct stat *st_addr)
 {
-  ptrdiff_t len = NAMLEN (dp);
+  ptrdiff_t len = dirent_namelen (dp);
   ptrdiff_t pos = SCHARS (dirname);
   int value;
   USE_SAFE_ALLOCA;

=== modified file 'src/makefile.w32-in'
--- a/src/makefile.w32-in       2012-11-17 23:16:24 +0000
+++ b/src/makefile.w32-in       2012-11-23 07:48:43 +0000
@@ -413,8 +413,6 @@
                 $(MS_W32_H)
 CONFIG_H       = $(SRC)/config.h \
                 $(CONF_POST_H)
-DIR_H          = $(NT_INC)/sys/dir.h \
-                $(SRC)/ndir.h
 W32GUI_H       = $(SRC)/w32gui.h \
                 $(SYSTIME_H)
 DISPEXTERN_H   = $(SRC)/dispextern.h \
@@ -714,6 +712,7 @@
        $(SRC)/blockinput.h \
        $(SRC)/commands.h \
        $(SRC)/regex.h \
+       $(NT_INC)/dirent.h \
        $(NT_INC)/pwd.h \
        $(NT_INC)/sys/stat.h \
        $(NT_INC)/unistd.h \
@@ -722,7 +721,6 @@
        $(CHARSET_H) \
        $(CODING_H) \
        $(CONFIG_H) \
-       $(DIR_H) \
        $(FILEMODE_H) \
        $(GRP_H) \
        $(LISP_H) \
@@ -1175,11 +1173,11 @@
 
 $(BLD)/w32.$(O) : \
        $(SRC)/w32.c \
-       $(SRC)/ndir.h \
        $(SRC)/w32.h \
        $(SRC)/w32common.h \
        $(SRC)/w32heap.h \
        $(SRC)/w32select.h \
+       $(NT_INC)/dirent.h \
        $(NT_INC)/pwd.h \
        $(NT_INC)/sys/file.h \
        $(NT_INC)/sys/time.h \

=== modified file 'src/sysdep.c'
--- a/src/sysdep.c      2012-11-21 21:06:52 +0000
+++ b/src/sysdep.c      2012-11-23 07:48:43 +0000
@@ -2220,28 +2220,6 @@
                       &emacs_norealloc_allocator, careadlinkatcwd);
 }
 
-/* Directory routines for systems that don't have them. */
-
-#ifdef HAVE_DIRENT_H
-
-#include <dirent.h>
-
-#if !defined (HAVE_CLOSEDIR)
-
-int
-closedir (DIR *dirp /* stream from opendir */)
-{
-  int rtnval;
-
-  rtnval = emacs_close (dirp->dd_fd);
-  xfree (dirp);
-
-  return rtnval;
-}
-#endif /* not HAVE_CLOSEDIR */
-#endif /* HAVE_DIRENT_H */
-
-
 /* Return a struct timeval that is roughly equivalent to T.
    Use the least timeval not less than T.
    Return an extremal value if the result would overflow.  */

=== modified file 'src/w32.c'
--- a/src/w32.c 2012-11-22 03:56:38 +0000
+++ b/src/w32.c 2012-11-23 07:48:43 +0000
@@ -179,7 +179,7 @@
 #undef sendto
 
 #include "w32.h"
-#include "ndir.h"
+#include <dirent.h>
 #include "w32common.h"
 #include "w32heap.h"
 #include "w32select.h"
@@ -2448,7 +2448,7 @@
    and readdir.  We can't use the procedures supplied in sysdep.c,
    so we provide them here.  */
 
-struct direct dir_static;       /* simulated directory contents */
+struct dirent dir_static;       /* simulated directory contents */
 static HANDLE dir_find_handle = INVALID_HANDLE_VALUE;
 static int    dir_is_fat;
 static char   dir_pathname[MAXPATHLEN+1];
@@ -2518,7 +2518,7 @@
   xfree ((char *) dirp);
 }
 
-struct direct *
+struct dirent *
 readdir (DIR *dirp)
 {
   int downcase = !NILP (Vw32_downcase_file_names);
@@ -2572,7 +2572,7 @@
       downcase = 1;    /* 8+3 aliases are returned in all caps */
     }
   dir_static.d_namlen = strlen (dir_static.d_name);
-  dir_static.d_reclen = sizeof (struct direct) - MAXNAMLEN + 3 +
+  dir_static.d_reclen = sizeof (struct dirent) - MAXNAMLEN + 3 +
     dir_static.d_namlen - dir_static.d_namlen % 4;
 
   /* If the file name in cFileName[] includes `?' characters, it means


reply via email to

[Prev in Thread] Current Thread [Next in Thread]