Port the extended stdio functions to emx+gcc.
authorBruno Haible <bruno@clisp.org>
Wed, 9 Apr 2008 22:56:00 +0000 (00:56 +0200)
committerBruno Haible <bruno@clisp.org>
Wed, 9 Apr 2008 22:56:00 +0000 (00:56 +0200)
12 files changed:
ChangeLog
lib/fbufmode.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

index 9ec295c6835e1e68e114a7ae5fb29139077215dc..5dfe4fa29cc86315e2d0fe2957b98848e9d1c092 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2008-04-08  Bruno Haible  <bruno@clisp.org>
+
+       Add tentative support for emx+gcc.
+       * lib/fbufmode.c (fbufmode) [__EMX__]: Add conditional code.
+       * lib/fpurge.c (fpurge): Likewise.
+       * lib/freadable.c (freadable): Likewise.
+       * lib/freadahead.c (freadahead): Likewise.
+       * lib/freading.c (freading): Likewise.
+       * lib/freadptr.c (freadptr): Likewise.
+       * lib/freadseek.c (freadptrinc): Likewise.
+       * lib/fseeko.c (rpl_fseeko): Likewise.
+       * lib/fseterr.c (fseterr): Likewise.
+       * lib/fwritable.c (fwritable): Likewise.
+       * lib/fwriting.c (fwriting): Likewise.
+
 2008-04-09  Eric Blake  <ebb9@byu.net>
 
        Avoid some autoconf warnings.
index 52ce917c400be703fdf37b7b9a22612789785b28..c775fc2e701d5aeafeddfa31ce9c58c5584fd2e2 100644 (file)
@@ -46,6 +46,8 @@ fbufmode (FILE *fp)
   if (fp->_flags & __SNBF)
     return _IONBF;
   return _IOFBF;
+#elif defined __EMX__               /* emx+gcc */
+  return fp->_flags & (_IOLBF | _IONBF | _IOFBF);
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 # if HAVE___FLBF                    /* Solaris >= 7 */
   if (__flbf (fp))
index 7bdc292637406dcd714c3d08dc18926bd50b7c31..05b58f2a706cf1ee8fab14ad4b0636ddb0ed8edc 100644 (file)
@@ -90,6 +90,12 @@ fpurge (FILE *fp)
       fp_ub._base = NULL;
     }
   return 0;
+# elif defined __EMX__              /* emx+gcc */
+  fp->_ptr = fp->_buffer;
+  fp->_rcount = 0;
+  fp->_wcount = 0;
+  fp->_ungetc_count = 0;
+  return 0;
 # elif defined _IOERR               /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 #  if defined _SCO_DS               /* OpenServer */
 #   define _base __base
index 9e9cb09da59f6d78f1628267d431c46fe36656d8..9ab3c10cd1716f23ae5cd2755c24211d8e5a8b6b 100644 (file)
@@ -29,6 +29,8 @@ freadable (FILE *fp)
   return (fp->_flags & _IO_NO_READS) == 0;
 #elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, 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 */
 # if defined _SCO_DS                /* OpenServer */
 #  define _flag __flag
index 6c02d75a15e702e4b9e78b98c70fb077e466fd18..1a8adabefdb783af9d24ddbb0783fc2970ccb05a 100644 (file)
@@ -43,6 +43,14 @@ freadahead (FILE *fp)
     return 0;
   return fp->_r
         + (HASUB (fp) ? fp->_ur : 0);
+#elif defined __EMX__               /* emx+gcc */
+  if ((fp->_flags & _IOWRT) != 0)
+    return 0;
+  /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
+           fp->_ungetc_count = 0 implies fp->_rcount >= 0.  */
+  /* equivalent to
+     (fp->_ungetc_count == 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount) */
+  return (fp->_rcount > 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount);
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
 #  define fp_ ((struct { unsigned char *_ptr; \
index 11c943cdfc1ac0270b2b82fdbca0224a9e24b42e..8540668f11ddbe765c50bf1c79557c742b7da919 100644 (file)
@@ -35,6 +35,8 @@ freading (FILE *fp)
              && fp->_IO_read_base != NULL));
 #elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, 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 */
 # if defined _SCO_DS                /* OpenServer */
 #  define _flag __flag
index 4b170363c2b7eb3fe255b48e92fbb30dbbbe3df2..33471a021f3620f52f4b249fe80c179136d64f5c 100644 (file)
@@ -19,6 +19,8 @@
 /* Specification.  */
 #include "freadptr.h"
 
+#include <stdlib.h>
+
 const char *
 freadptr (FILE *fp, size_t *sizep)
 {
@@ -41,6 +43,17 @@ freadptr (FILE *fp, size_t *sizep)
     return NULL;
   *sizep = size;
   return (const char *) fp->_p;
+#elif defined __EMX__               /* emx+gcc */
+  if ((fp->_flags & _IOWRT) != 0)
+    return NULL;
+  /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
+           fp->_ungetc_count = 0 implies fp->_rcount >= 0.  */
+  if (fp->_rcount <= 0)
+    return NULL;
+  if (fp->_ungetc_count == 0)
+    abort ();
+  *sizep = fp->_rcount;
+  return fp->_ptr;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
 #  define fp_ ((struct { unsigned char *_ptr; \
index 82fd648191e0ca8c6c5127f36f9243bb34d7c469..bb6a7ad797a3de3feb83b493dc5d402cc1b4aaa0 100644 (file)
@@ -37,6 +37,9 @@ freadptrinc (FILE *fp, size_t increment)
 #elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
   fp->_p += increment;
   fp->_r -= increment;
+#elif defined __EMX__               /* emx+gcc */
+  fp->_ptr += increment;
+  fp->_rcount -= increment;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
 #  define fp_ ((struct { unsigned char *_ptr; \
index 1ed8921ad93078cd31d2638177239a3356fdb8d3..e764cacf87b422be767e54dd6c3fa3bb2b52e673 100644 (file)
@@ -70,6 +70,11 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
                    ? fp->_bf._size
                    : 0)
       && fp_ub._base == NULL)
+#elif defined __EMX__               /* emx+gcc */
+  if (fp->_ptr == fp->_buffer
+      && fp->_rcount == 0
+      && fp->_wcount == 0
+      && fp->_ungetc_count == 0)
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
 #  define fp_ ((struct { unsigned char *_ptr; \
@@ -117,6 +122,8 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
          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 */
 # if defined _SCO_DS                /* OpenServer */
 #  define _flag __flag
index 7b0c68b9f072c93731eeea105cd16ee9de33240b..72560169ed4b2cf098b591c0b25893c9fbc84a46 100644 (file)
@@ -31,6 +31,8 @@ fseterr (FILE *fp)
   fp->_flags |= _IO_ERR_SEEN;
 #elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, 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 */
 # if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
 #  define fp_ ((struct { unsigned char *_ptr; \
index 278ef7e3c5861fab0aa69a016d7f8dc2e0df96b4..f821cfbd29a9a567acfdb482ea8ce0405d49fe0c 100644 (file)
@@ -29,6 +29,8 @@ fwritable (FILE *fp)
   return (fp->_flags & _IO_NO_WRITES) == 0;
 #elif defined __sferror             /* FreeBSD, NetBSD, OpenBSD, 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 */
 # if defined _SCO_DS                /* OpenServer */
 #  define _flag __flag
index 9f3c1c98baeecb19447da0fd174774ac452746ec..2ad0d6c2951bd60b9a6259ca24ad5de8ae20839b 100644 (file)
@@ -29,6 +29,8 @@ fwriting (FILE *fp)
   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 __EMX__               /* emx+gcc */
+  return (fp->_flags & _IOWRT) != 0;
 #elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 # if defined _SCO_DS                /* OpenServer */
 #  define _flag __flag