diff options
author | simonm <unknown> | 1998-12-02 13:32:30 +0000 |
---|---|---|
committer | simonm <unknown> | 1998-12-02 13:32:30 +0000 |
commit | 438596897ebbe25a07e1c82085cfbc5bdb00f09e (patch) | |
tree | da7a441396aed2e13f6e0cc55282bf041b0cf72c /ghc/lib/std/cbits/writeFile.lc | |
parent | 967cc47f37cb93a5e2b6df7822c9a646f0428247 (diff) | |
download | haskell-438596897ebbe25a07e1c82085cfbc5bdb00f09e.tar.gz |
[project @ 1998-12-02 13:17:09 by simonm]
Move 4.01 onto the main trunk.
Diffstat (limited to 'ghc/lib/std/cbits/writeFile.lc')
-rw-r--r-- | ghc/lib/std/cbits/writeFile.lc | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/ghc/lib/std/cbits/writeFile.lc b/ghc/lib/std/cbits/writeFile.lc deleted file mode 100644 index 1cd336e71d..0000000000 --- a/ghc/lib/std/cbits/writeFile.lc +++ /dev/null @@ -1,133 +0,0 @@ -% -% (c) The GRASP/AQUA Project, Glasgow University, 1994 -% -\subsection[writeFile.lc]{hPutStr Runtime Support} - -\begin{code} - -#include "rtsdefs.h" -#include "stgio.h" - -StgInt -writeFileObject(ptr, bytes) -StgForeignObj ptr; -StgInt bytes; -{ - int rc=0; - IOFileObject* fo = (IOFileObject*)ptr; - - char *p = (char *) fo->buf; - - /* If we've got a r/w file object in our hand, flush the - (input) buffer contents first. - */ - if ( FILEOBJ_READABLE(fo) && FILEOBJ_JUST_READ(fo) ) { - fo->flags = (fo->flags & ~FILEOBJ_RW_READ) | FILEOBJ_RW_WRITE; - rc = flushReadBuffer(ptr); - if (rc < 0) return rc; - } - - return (writeBuffer(ptr, bytes)); -} - -StgInt -writeBuffer(ptr, bytes) -StgForeignObj ptr; -StgInt bytes; -{ - int count, rc=0; - IOFileObject* fo = (IOFileObject*)ptr; - - char *p = (char *) fo->buf; - - /* Disallow short writes */ - if (bytes == 0 || fo->buf == NULL) - return 0; - - if ( fo->flags & FILEOBJ_NONBLOCKING_IO && inputReady(ptr,0) != 1 ) - return FILEOBJ_BLOCKED_WRITE; - - while ((count = write(fo->fd, fo->buf, bytes)) < bytes) { - if (errno != EINTR) { - cvtErrno(); - stdErrno(); - return -1; - } - bytes -= count; - p += count; - } - /* Signal that we've emptied the buffer */ - fo->bufWPtr=0; - return 0; -} - - -StgInt -writeBuf(ptr, buf, len) -StgForeignObj ptr; -StgAddr buf; -StgInt len; -{ - IOFileObject* fo = (IOFileObject*)ptr; - int count; - int rc = 0; - char *p = (char *) buf; - - if (len == 0 ) - return 0; - - - /* First of all, check if we do need to flush the buffer .. */ - /* Note - in the case of line buffering, we do not currently check - whether we need to flush buffer due to line terminators in the - buffer we're outputting */ - if ( fo->buf != NULL && /* buffered and */ - (fo->bufWPtr + len < (fo->bufSize)) /* there's room */ - ) { - /* Block copying is likely to be cheaper than, flush, followed by write */ - memcpy(((char*)fo->buf + fo->bufWPtr), buf, len); - fo->bufWPtr += len; - return 0; - } - /* If we do overflow, flush current contents of the buffer and - directly output the chunk. - (no attempt at splitting up the chunk is currently made) - */ - if ( fo->buf != NULL && /* buffered and */ - (fo->bufWPtr + len >= (fo->bufSize)) /* there's not room */ - ) { - /* Flush buffer */ - rc = writeFileObject(ptr, fo->bufWPtr); - /* ToDo: undo buffer fill if we're blocking.. */ - } - - if (rc != 0) { - return rc; - } - - if ( fo->flags & FILEOBJ_NONBLOCKING_IO && inputReady(ptr,0) != 1 ) - return FILEOBJ_BLOCKED_WRITE; - - /* Disallow short writes */ - while ((count = write(fo->fd, (char *)buf, (int)len)) < len) { - if (errno != EINTR) { - cvtErrno(); - stdErrno(); - return -1; - } - len -= count; - p += count; - } - - return 0; -} - -StgInt -writeBufBA(ptr, buf, len) -StgForeignObj ptr; -StgByteArray buf; -StgInt len; -{ return (writeBuf(ptr,(StgAddr)buf, len)); } - - -\end{code} |