Add tentative support for DragonFly BSD.
authorBruno Haible <bruno@clisp.org>
Sat, 26 Apr 2008 16:58:00 +0000 (18:58 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 26 Apr 2008 16:58:00 +0000 (18:58 +0200)
14 files changed:
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

index ae6d9e9..ca2af21 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
 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.
        * lib/fbufmode.c: Include stdio-impl.h.
        (fbufmode): Use fp_, remove redundant #defines.
index faaf089..961ae2a 100644 (file)
@@ -42,10 +42,10 @@ fbufmode (FILE *fp)
   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 */
index 860e8c8..f143247 100644 (file)
 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 @@ restore_seek_optimization (FILE *fp, int saved_flags)
 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 @@ rpl_fflush (FILE *stream)
   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
index 29716ae..c82d801 100644 (file)
@@ -35,7 +35,7 @@ fpurge (FILE *fp)
   /* 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 @@ fpurge (FILE *fp)
   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 @@ fpurge (FILE *fp)
        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 @@ fpurge (FILE *fp)
       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;
     }
index 77351ab..54703da 100644 (file)
@@ -29,8 +29,8 @@ freadable (FILE *fp)
      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 */
index 12e4bd1..610de87 100644 (file)
@@ -30,11 +30,11 @@ freadahead (FILE *fp)
   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;
index b1c233c..e201b89 100644 (file)
@@ -35,8 +35,8 @@ freading (FILE *fp)
   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 */
index 02b79e1..6e08b48 100644 (file)
@@ -37,14 +37,14 @@ freadptr (FILE *fp, size_t *sizep)
     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;
index b7501bc..f56f8b1 100644 (file)
@@ -36,9 +36,9 @@ freadptrinc (FILE *fp, size_t increment)
   /* 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;
index 831898c..536dfaf 100644 (file)
@@ -45,7 +45,7 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
   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 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
       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 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
       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 */
index f31e5b9..69fcd32 100644 (file)
@@ -31,8 +31,8 @@ fseterr (FILE *fp)
      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 */
index bb95975..691ddc5 100644 (file)
@@ -29,8 +29,8 @@ fwritable (FILE *fp)
      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 */
index 14e9ae3..7ce0925 100644 (file)
@@ -29,8 +29,8 @@ fwriting (FILE *fp)
      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 */
index f9f667d..b9572b4 100644 (file)
 
 /* 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