diff options
author | sof <unknown> | 1998-08-14 12:42:23 +0000 |
---|---|---|
committer | sof <unknown> | 1998-08-14 12:42:23 +0000 |
commit | bf64fa7057773902012e3cbea5186bc06b94be0b (patch) | |
tree | f7b8f34ac5604f7027a33a2d5901ffb97b32c35e /ghc/lib/std/cbits/fileObject.h | |
parent | fb49b1af911ded218b3b3a84c784be2542c53e86 (diff) | |
download | haskell-bf64fa7057773902012e3cbea5186bc06b94be0b.tar.gz |
[project @ 1998-08-14 12:42:01 by sof]
Beefed up IO stub functions to not have to rely on stdio any longer
Diffstat (limited to 'ghc/lib/std/cbits/fileObject.h')
-rw-r--r-- | ghc/lib/std/cbits/fileObject.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/ghc/lib/std/cbits/fileObject.h b/ghc/lib/std/cbits/fileObject.h new file mode 100644 index 0000000000..f41e8fdcad --- /dev/null +++ b/ghc/lib/std/cbits/fileObject.h @@ -0,0 +1,78 @@ +#ifndef FILEOBJECT_H +#define FILEOBJECT_H + +/* a good idea? */ +#include <stdio.h> + +/* + IOFileObjects are used as part of the IO.Handle + implementation, ensuring that when handles are + finalised, buffers are flushed and FILE* objects + are closed (we really should be using file descriptors + here..) + + */ + +typedef struct _IOFileObject { + int fd; + void* buf; + int bufWPtr; /* points to next position to write, + bufRPtr >= bufWPtr <= bufSize. + + For read-only files, bufWPtr = bufSize + + bufWPtr = 0 => buffer is empty. + + */ + int bufRPtr; /* points to the next char to read + -1 >= bufRPtr <= bufWPtr + + For write-only files, bufRPtr = 0 + + bufRPtr == -1 => buffer is empty. + */ + int bufSize; + int flags; + struct _IOFileObject* connectedTo; +} IOFileObject; + +#define FILEOBJ_FLUSH 1 +#define FILEOBJ_LB 2 +#define FILEOBJ_BB 4 +#define FILEOBJ_EOF 8 +#define FILEOBJ_READ 16 +#define FILEOBJ_WRITE 32 +#define FILEOBJ_STD 64 +#define FILEOBJ_NONBLOCKING_IO 128 +/* The next two flags are used for RW file objects only. + They indicate whether the last operation was a read or a write. + (Need this info to determine whether a RW file object's + buffer should be flushed before doing a subsequent + read or write). +*/ +#define FILEOBJ_RW_READ 256 +#define FILEOBJ_RW_WRITE 512 + +#define FILEOBJ_IS_EOF(x) ((x)->flags & FILEOBJ_EOF) +#define FILEOBJ_SET_EOF(x) ((x)->flags |= FILEOBJ_EOF) +#define FILEOBJ_CLEAR_EOF(x) ((x)->flags &= ~FILEOBJ_EOF) +#define FILEOBJ_CLEAR_ERR(x) FILEOBJ_CLEAR_EOF(x) + +#define FILEOBJ_BLOCKED_READ -5 +#define FILEOBJ_BLOCKED_WRITE -6 +#define FILEOBJ_BLOCKED_CONN_WRITE -7 + +#define FILEOBJ_UNBUFFERED(x) (!((x)->flags & FILEOBJ_LB) && !((x)->flags & FILEOBJ_BB)) +#define FILEOBJ_LINEBUFFERED(x) ((x)->flags & FILEOBJ_LB) +#define FILEOBJ_BLOCKBUFFERED(x) ((x)->flags & FILEOBJ_BB) +#define FILEOBJ_BUFFER_FULL(x) ((x)->bufWPtr >= (x)->bufSize) +#define FILEOBJ_BUFFER_EMPTY(x) ((x)->bufRPtr == (x)->bufWPtr) +#define FILEOBJ_HAS_PUSHBACKS(x) ((x)->buf != NULL && (x)->bufRPtr >= 0 && (x)->bufRPtr < (x)->bufWPtr) +#define FILEOBJ_READABLE(x) ((x)->flags & FILEOBJ_READ) +#define FILEOBJ_WRITEABLE(x) ((x)->flags & FILEOBJ_WRITE) +#define FILEOBJ_JUST_READ(x) ((x)->flags & FILEOBJ_RW_READ) +#define FILEOBJ_JUST_WRITTEN(x) ((x)->flags & FILEOBJ_RW_WRITE) +#define FILEOBJ_NEEDS_FLUSHING(x) (!FILEOBJ_BUFFER_EMPTY(x)) +#define FILEOBJ_RW(x) (FILEOBJ_READABLE(x) && FILEOBJ_WRITEABLE(x)) + +#endif /* FILEOBJECT_H */ |