changeset 9981:e3d6988a9347

Add tentative support for DragonFly BSD.
author Bruno Haible <bruno@clisp.org>
date Sat, 26 Apr 2008 18:58:00 +0200
parents 2c1ba629f5d5
children a4502ab3c8d6
files ChangeLog lib/fbufmode.c lib/fflush.c lib/fpurge.c lib/freadable.c lib/freadahead.c lib/freading.c lib/freadptr.c lib/freadseek.c lib/fseeko.c lib/fseterr.c lib/fwritable.c lib/fwriting.c lib/stdio-impl.h
diffstat 14 files changed, 106 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2008-04-26  Bruno Haible  <bruno@clisp.org>
+
+	Add tentative support for DragonFly BSD.
+	* lib/stdio-impl.h: Add macros for DragonFly BSD.
+	* lib/fbufmode.c (fbufmode): Update conditionals. Use fp_ instead of
+	fp.
+	* lib/fflush.c (clear_ungetc_buffer, disable_seek_optimization,
+	restore_seek_optimization, update_fpos_cache, rpl_fflush: Likewise.
+	* lib/fpurge.c (fpurge): Likewise.
+	* lib/freadable.c (freaadable): Likewise.
+	* lib/freadahead.c (freadahead): Likewise.
+	* lib/freading.c (freading): Likewise.
+	* lib/freadptr.c (freadptr): Likewise.
+	* lib/freadseek.c (freadptrinc): Likewise.
+	* lib/fseeko.c (fseeko): Likewise.
+	* lib/fseterr.c (fseterr): Likewise.
+	* lib/fwritable.c (fwritable): Likewise.
+	* lib/fwriting.c (fwriting): Likewise.
+
 2008-04-26  Bruno Haible  <bruno@clisp.org>
 
 	* lib/stdio-impl.h: New file.
--- a/lib/fbufmode.c
+++ b/lib/fbufmode.c
@@ -42,10 +42,10 @@
   if (fp->_flags & _IO_UNBUFFERED)
     return _IONBF;
   return _IOFBF;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  if (fp->_flags & __SLBF)
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  if (fp_->_flags & __SLBF)
     return _IOLBF;
-  if (fp->_flags & __SNBF)
+  if (fp_->_flags & __SNBF)
     return _IONBF;
   return _IOFBF;
 #elif defined __EMX__               /* emx+gcc */
--- a/lib/fflush.c
+++ b/lib/fflush.c
@@ -34,29 +34,29 @@
 static inline void
 clear_ungetc_buffer (FILE *fp)
 {
-#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
   if (HASUB (fp))
     {
-      fp->_p += stream->_r;
-      fp->_r = 0;
+      fp_->_p += fp_->_r;
+      fp_->_r = 0;
     }
 #endif
 }
 
-#if defined __sferror && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+#if (defined __sferror || defined __DragonFly__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
 
 static inline int
 disable_seek_optimization (FILE *fp)
 {
-  int saved_flags = fp->_flags & (__SOPT | __SNPT);
-  fp->_flags = (fp->_flags & ~__SOPT) | __SNPT;
+  int saved_flags = fp_->_flags & (__SOPT | __SNPT);
+  fp_->_flags = (fp_->_flags & ~__SOPT) | __SNPT;
   return saved_flags;
 }
 
 static inline void
 restore_seek_optimization (FILE *fp, int saved_flags)
 {
-  fp->_flags = (fp->_flags & ~(__SOPT | __SNPT)) | saved_flags;
+  fp_->_flags = (fp_->_flags & ~(__SOPT | __SNPT)) | saved_flags;
 }
 
 #endif
@@ -64,9 +64,9 @@
 static inline void
 update_fpos_cache (FILE *fp)
 {
-#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  fp->_offset = pos;
-  fp->_flags |= __SOFF;
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  fp_->_offset = pos;
+  fp_->_flags |= __SOFF;
 #endif
 }
 
@@ -140,7 +140,7 @@
   if (result != 0)
     return result;
 
-#if defined __sferror && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+#if (defined __sferror || defined __DragonFly__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
 
   {
     /* Disable seek optimization for the next fseeko call.  This tells the
--- a/lib/fpurge.c
+++ b/lib/fpurge.c
@@ -35,7 +35,7 @@
   /* The __fpurge function does not have a return value.  */
   return 0;
 
-#elif HAVE_FPURGE                   /* FreeBSD, NetBSD, OpenBSD, MacOS X */
+#elif HAVE_FPURGE                   /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X */
 
   /* Call the system's fpurge function.  */
 # undef fpurge
@@ -43,7 +43,7 @@
   extern int fpurge (FILE *);
 # endif
   int result = fpurge (fp);
-# if defined __sferror              /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
   if (result == 0)
     /* Correct the invariants that fpurge broke.
        <stdio.h> on BSD systems says:
@@ -51,8 +51,8 @@
        If this invariant is not fulfilled and the stream is read-write but
        currently writing, subsequent putc or fputc calls will write directly
        into the buffer, although they shouldn't be allowed to.  */
-    if ((fp->_flags & __SRD) != 0)
-      fp->_w = 0;
+    if ((fp_->_flags & __SRD) != 0)
+      fp_->_w = 0;
 # endif
   return result;
 
@@ -71,16 +71,16 @@
       fp->_IO_save_base = NULL;
     }
   return 0;
-# elif defined __sferror            /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  fp->_p = fp->_bf._base;
-  fp->_r = 0;
-  fp->_w = ((fp->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
-	    ? fp->_bf._size
-	    : 0);
+# elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  fp_->_p = fp_->_bf._base;
+  fp_->_r = 0;
+  fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+	     ? fp_->_bf._size
+	     : 0);
   /* Avoid memory leak when there is an active ungetc buffer.  */
   if (fp_ub._base != NULL)
     {
-      if (fp_ub._base != fp->_ubuf)
+      if (fp_ub._base != fp_->_ubuf)
 	free (fp_ub._base);
       fp_ub._base = NULL;
     }
--- a/lib/freadable.c
+++ b/lib/freadable.c
@@ -29,8 +29,8 @@
      fast macros.  */
 #if defined _IO_ferror_unlocked || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Linux libc5 */
   return (fp->_flags & _IO_NO_READS) == 0;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  return (fp->_flags & (__SRW | __SRD)) != 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  return (fp_->_flags & (__SRW | __SRD)) != 0;
 #elif defined __EMX__               /* emx+gcc */
   return (fp->_flags & (_IORW | _IOREAD)) != 0;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
--- a/lib/freadahead.c
+++ b/lib/freadahead.c
@@ -30,11 +30,11 @@
   return (fp->_IO_read_end - fp->_IO_read_ptr)
 	 + (fp->_flags & _IO_IN_BACKUP ? fp->_IO_save_end - fp->_IO_save_base :
 	    0);
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  if ((fp->_flags & __SWR) != 0 || fp->_r < 0)
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
     return 0;
-  return fp->_r
-	 + (HASUB (fp) ? fp->_ur : 0);
+  return fp_->_r
+	 + (HASUB (fp) ? fp_->_ur : 0);
 #elif defined __EMX__               /* emx+gcc */
   if ((fp->_flags & _IOWRT) != 0)
     return 0;
--- a/lib/freading.c
+++ b/lib/freading.c
@@ -35,8 +35,8 @@
   return ((fp->_flags & _IO_NO_WRITES) != 0
 	  || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
 	      && fp->_IO_read_base != NULL));
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  return (fp->_flags & __SRD) != 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  return (fp_->_flags & __SRD) != 0;
 #elif defined __EMX__               /* emx+gcc */
   return (fp->_flags & _IOREAD) != 0;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
--- a/lib/freadptr.c
+++ b/lib/freadptr.c
@@ -37,14 +37,14 @@
     return NULL;
   *sizep = size;
   return (const char *) fp->_IO_read_ptr;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  if ((fp->_flags & __SWR) != 0 || fp->_r < 0)
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
     return NULL;
-  size = fp->_r;
+  size = fp_->_r;
   if (size == 0)
     return NULL;
   *sizep = size;
-  return (const char *) fp->_p;
+  return (const char *) fp_->_p;
 #elif defined __EMX__               /* emx+gcc */
   if ((fp->_flags & _IOWRT) != 0)
     return NULL;
--- a/lib/freadseek.c
+++ b/lib/freadseek.c
@@ -36,9 +36,9 @@
   /* Keep this code in sync with freadptr!  */
 #if defined _IO_ferror_unlocked || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Linux libc5 */
   fp->_IO_read_ptr += increment;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  fp->_p += increment;
-  fp->_r -= increment;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  fp_->_p += increment;
+  fp_->_r -= increment;
 #elif defined __EMX__               /* emx+gcc */
   fp->_ptr += increment;
   fp->_rcount -= increment;
--- a/lib/fseeko.c
+++ b/lib/fseeko.c
@@ -45,7 +45,7 @@
   if (fp->_IO_read_end == fp->_IO_read_ptr
       && fp->_IO_write_ptr == fp->_IO_write_base
       && fp->_IO_save_base == NULL)
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
 # if defined __SL64 && defined __SCLE /* Cygwin */
   if ((fp->_flags & __SL64) == 0)
     {
@@ -59,11 +59,11 @@
       fclose (tmp);
     }
 # endif
-  if (fp->_p == fp->_bf._base
-      && fp->_r == 0
-      && fp->_w == ((fp->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
-		    ? fp->_bf._size
-		    : 0)
+  if (fp_->_p == fp_->_bf._base
+      && fp_->_r == 0
+      && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+		     ? fp_->_bf._size
+		     : 0)
       && fp_ub._base == NULL)
 #elif defined __EMX__               /* emx+gcc */
   if (fp->_ptr == fp->_buffer
@@ -89,17 +89,17 @@
       off_t pos = lseek (fileno (fp), offset, whence);
       if (pos == -1)
 	{
-#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-	  fp->_flags &= ~__SOFF;
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+	  fp_->_flags &= ~__SOFF;
 #endif
 	  return -1;
 	}
       else
 	{
-#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-	  fp->_offset = pos;
-	  fp->_flags |= __SOFF;
-	  fp->_flags &= ~__SEOF;
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+	  fp_->_offset = pos;
+	  fp_->_flags |= __SOFF;
+	  fp_->_flags &= ~__SEOF;
 #elif defined __EMX__               /* emx+gcc */
           fp->_flags &= ~_IOEOF;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
--- a/lib/fseterr.c
+++ b/lib/fseterr.c
@@ -31,8 +31,8 @@
      fast macros.  */
 #if defined _IO_ferror_unlocked || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Linux libc5 */
   fp->_flags |= _IO_ERR_SEEN;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  fp->_flags |= __SERR;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  fp_->_flags |= __SERR;
 #elif defined __EMX__               /* emx+gcc */
   fp->_flags |= _IOERR;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
--- a/lib/fwritable.c
+++ b/lib/fwritable.c
@@ -29,8 +29,8 @@
      fast macros.  */
 #if defined _IO_ferror_unlocked || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Linux libc5 */
   return (fp->_flags & _IO_NO_WRITES) == 0;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  return (fp->_flags & (__SRW | __SWR)) != 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  return (fp_->_flags & (__SRW | __SWR)) != 0;
 #elif defined __EMX__               /* emx+gcc */
   return (fp->_flags & (_IORW | _IOWRT)) != 0;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
--- a/lib/fwriting.c
+++ b/lib/fwriting.c
@@ -29,8 +29,8 @@
      fast macros.  */
 #if defined _IO_ferror_unlocked || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Linux libc5 */
   return (fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) != 0;
-#elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
-  return (fp->_flags & __SWR) != 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+  return (fp_->_flags & __SWR) != 0;
 #elif defined __EMX__               /* emx+gcc */
   return (fp->_flags & _IOWRT) != 0;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
--- a/lib/stdio-impl.h
+++ b/lib/stdio-impl.h
@@ -21,7 +21,34 @@
 
 /* BSD stdio derived implementations.  */
 
-#if defined __sferror               /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+# if defined __DragonFly__          /* DragonFly */
+  /* See <http://www.dragonflybsd.org/cvsweb/src/lib/libc/stdio/priv_stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>.  */
+#  define fp_ ((struct { struct __FILE_public pub; \
+			 struct { unsigned char *_base; int _size; } _bf; \
+			 void *cookie; \
+			 void *_close; \
+			 void *_read; \
+			 void *_seek; \
+			 void *_write; \
+			 struct { unsigned char *_base; int _size; } _ub; \
+			 int _ur; \
+			 unsigned char _ubuf[3]; \
+			 unsigned cahr _nbuf[1]; \
+			 struct { unsigned char *_base; int _size; } _lb; \
+			 int _blksize; \
+			 fpos_t _offset; \
+			 /* More fields, not relevant here.  */ \
+		       } *) fp)
+  /* See <http://www.dragonflybsd.org/cvsweb/src/include/stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>.  */
+#  define _p pub._p
+#  define _flags pub._flags
+#  define _r pub._r
+#  define _w pub._w
+# else
+#  define fp_ fp
+# endif
 
 # if defined __NetBSD__ || defined __OpenBSD__ /* NetBSD, OpenBSD */
   /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
@@ -32,7 +59,7 @@
       /* More fields, not relevant here.  */
     };
 #  define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
-# else                                         /* FreeBSD, MacOS X, Cygwin */
+# else                                         /* FreeBSD, DragonFly, MacOS X, Cygwin */
 #  define fp_ub fp->_ub
 # endif