2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
4 * $Id: flushFile.c,v 1.5 1999/09/19 19:26:14 sof Exp $
6 * hFlush Runtime Support
16 IOFileObject* fo = (IOFileObject*)ptr;
19 if ( (fo->flags & FILEOBJ_FLUSH) && FILEOBJ_NEEDS_FLUSHING(fo) ) {
20 rc = writeBuffer(ptr,fo->bufWPtr - fo->bufRPtr);
30 IOFileObject* fo = (IOFileObject*)ptr;
33 /* If the file object is writeable, or if it's
34 RW *and* the last operation on it was a write,
37 if ( (!FILEOBJ_READABLE(fo) && FILEOBJ_WRITEABLE(fo)) ||
38 (FILEOBJ_RW(fo) && FILEOBJ_JUST_WRITTEN(fo)) ) {
43 /* Reset read & write pointer for input buffers */
44 if ( (fo->flags & FILEOBJ_READ) ) {
52 For RW file objects, flushing input buffers doesn't just involve
53 resetting the read & write pointers, we also have to change the
54 underlying file position to point to the effective read position.
56 (Sigh, I now understand the real reason for why stdio opted for
57 the solution of leaving this to the programmer!)
63 IOFileObject* fo = (IOFileObject*)ptr;
66 delta = fo->bufWPtr - fo->bufRPtr;
69 while ( lseek(fo->fd, -delta, SEEK_CUR) == -1) {
84 flushConnectedBuf(ptr)
88 IOFileObject* fo = (IOFileObject*)ptr;
90 /* if the stream is connected to an output stream, flush it. */
91 if ( fo->connectedTo != NULL && fo->connectedTo->fd != -1 &&
92 (fo->connectedTo->flags & FILEOBJ_WRITE) ) {
93 rc = flushBuffer((StgForeignPtr)fo->connectedTo);
95 /* Willfully ignore the return code for now. */