* lib/stdio-impl.h: Include <errno.h>.
* lib/fseterr.c (fseterr) [EPLAN9]: Add conditional code.
* lib/freadable.c (freadable): Likewise.
* lib/fwritable.c (fwritable): Likewise.
* lib/fbufmode.c (fbufmode): Likewise.
* lib/freading.c (freading): Likewise.
* lib/fwriting.c (fwriting): Likewise.
* lib/freadptr.c (freadptr): Likewise.
* lib/freadseek.c (freadptrinc): Likewise.
* lib/freadahead.c (freadahead): Likewise.
* lib/fpurge.c (fpurge): Likewise.
* lib/fseeko.c (rpl_fseeko): Likewise.
* m4/fpending.m4 (gl_PREREQ_FPENDING): Add a variant for Plan9.
Reported by Jens Staal <staal1978@gmail.com>.
+2012-02-03 Bruno Haible <bruno@clisp.org>
+
+ stdioext: Add tentative support for Plan9.
+ * lib/stdio-impl.h: Include <errno.h>.
+ * lib/fseterr.c (fseterr) [EPLAN9]: Add conditional code.
+ * lib/freadable.c (freadable): Likewise.
+ * lib/fwritable.c (fwritable): Likewise.
+ * lib/fbufmode.c (fbufmode): Likewise.
+ * lib/freading.c (freading): Likewise.
+ * lib/fwriting.c (fwriting): Likewise.
+ * lib/freadptr.c (freadptr): Likewise.
+ * lib/freadseek.c (freadptrinc): Likewise.
+ * lib/freadahead.c (freadahead): Likewise.
+ * lib/fpurge.c (fpurge): Likewise.
+ * lib/fseeko.c (rpl_fseeko): Likewise.
+ * m4/fpending.m4 (gl_PREREQ_FPENDING): Add a variant for Plan9.
+ Reported by Jens Staal <staal1978@gmail.com>.
+
2012-02-02 Jim Meyering <meyering@redhat.com>
file-has-acl: suppress a warning from gcc -Wsuggest-attribute=const
if (fp->__linebuf)
return _IOLBF;
return (fp->__bufsize > 0 ? _IOFBF : _IONBF);
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->flags & 2 /* LINEBUF */)
+ return _IOLBF;
+ if (fp->bufl)
+ return _IOFBF;
+ return _IONBF;
#else
# error "Please port gnulib fbufmode.c to your platform! Look at the setvbuf implementation."
#endif
/* Nothing in the buffer, next putc is nontrivial. */
fp->__put_limit = fp->__buffer;
return 0;
+# elif defined EPLAN9 /* Plan9 */
+ fp->rp = fp->wp = fp->lp = fp->buf;
+ return 0;
# else
# error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."
# endif
#include "stdio-impl.h"
+#if defined EPLAN9 /* Plan9 */
+# include <fcntl.h>
+#endif
+
bool
freadable (FILE *fp)
{
return (fp->_Mode & 0x1 /* _MOPENR */) != 0;
#elif defined __MINT__ /* Atari FreeMiNT */
return fp->__mode.__read;
+#elif defined EPLAN9 /* Plan9 */
+ int fd = fp->fd;
+ if (fd >= 0)
+ {
+ int flags = fcntl (fd, F_GETFL, NULL);
+ if (flags >= 0)
+ {
+ flags &= O_ACCMODE;
+ return (flags == O_RDONLY || flags == O_RDWR);
+ }
+ }
+ return 0;
#else
# error "Please port gnulib freadable.c to your platform! Look at the definition of fopen, fdopen on your system, then report this to bug-gnulib."
#endif
return (fp->__pushed_back
? fp->__get_limit - fp->__pushback_bufp + 1
: fp->__get_limit - fp->__bufp);
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->state == 4 /* WR */ || fp->rp >= fp->wp)
+ return 0;
+ return fp->wp - fp->rp;
#elif defined SLOW_BUT_NO_HACKS /* users can define this */
abort ();
return 0;
# else
return (fp->__buffer < fp->__get_limit /*|| fp->__bufp == fp->__put_limit ??*/);
# endif
+# elif defined EPLAN9 /* Plan9 */
+ if (fp->state == 0 /* CLOSED */ || fp->state == 4 /* WR */)
+ return 0;
+ return (fp->state == 3 /* RD */ && (fp->bufl == 0 || fp->rp < fp->wp));
# else
# error "Please port gnulib freading.c to your platform!"
# endif
return NULL;
*sizep = size;
return fp->__bufp;
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->state == 4 /* WR */)
+ return NULL;
+ if (fp->rp >= fp->wp)
+ return NULL;
+ *sizep = fp->wp - fp->rp;
+ return fp->rp;
#elif defined SLOW_BUT_NO_HACKS /* users can define this */
/* This implementation is correct on any ANSI C platform. It is just
awfully slow. */
fp->_Next += increment;
#elif defined __MINT__ /* Atari FreeMiNT */
fp->__bufp += increment;
+#elif defined EPLAN9 /* Plan9 */
+ fp->rp += increment;
#elif defined SLOW_BUT_NO_HACKS /* users can define this */
#else
#error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report this to bug-gnulib."
&& fp->__get_limit == fp->__bufp
&& fp->__put_limit == fp->__bufp
&& !fp->__pushed_back)
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->rp == fp->buf
+ && fp->wp == fp->buf)
#else
#error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib."
#endif
fp->_Mode |= 0x200 /* _MERR */;
#elif defined __MINT__ /* Atari FreeMiNT */
fp->__error = 1;
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->state != 0 /* CLOSED */)
+ fp->state = 5 /* ERR */;
#elif 0 /* unknown */
/* Portable fallback, based on an idea by Rich Felker.
Wow! 6 system calls for something that is just a bit operation!
return (fp->_Mode & 0x2 /* _MOPENW */) != 0;
#elif defined __MINT__ /* Atari FreeMiNT */
return fp->__mode.__write;
+#elif defined EPLAN9 /* Plan9 */
+ int fd = fp->fd;
+ if (fd >= 0)
+ {
+ int flags = fcntl (fd, F_GETFL, NULL);
+ if (flags >= 0)
+ {
+ flags &= O_ACCMODE;
+ return (flags == O_WRONLY || flags == O_RDWR);
+ }
+ }
+ return 0;
#else
# error "Please port gnulib fwritable.c to your platform! Look at the definition of fopen, fdopen on your system, then report this to bug-gnulib."
#endif
# else
return (fp->__buffer < fp->__put_limit /*|| fp->__bufp == fp->__get_limit ??*/);
# endif
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->state == 0 /* CLOSED */ || fp->state == 3 /* RD */)
+ return 0;
+ return (fp->state == 4 /* WR */ && (fp->bufl == 0 || fp->wp < fp->rp));
#else
# error "Please port gnulib fwriting.c to your platform!"
#endif
# include <sys/param.h>
#endif
+#include <errno.h> /* For detecting Plan9. */
+
#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
# if defined __DragonFly__ /* DragonFly */
-# serial 18
+# serial 19
# Copyright (C) 2000-2001, 2004-2012 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
'# Minix' \
'fp->_ptr - fp->_buf' \
\
+ '# Plan9' \
+ 'fp->wp - fp->buf' \
+ \
'# VMS' \
'(*fp)->_ptr - (*fp)->_base' \
\