summaryrefslogtreecommitdiff
path: root/ghc/lib/std/cbits/fileObject.h
diff options
context:
space:
mode:
authorsof <unknown>1998-08-14 12:42:23 +0000
committersof <unknown>1998-08-14 12:42:23 +0000
commitbf64fa7057773902012e3cbea5186bc06b94be0b (patch)
treef7b8f34ac5604f7027a33a2d5901ffb97b32c35e /ghc/lib/std/cbits/fileObject.h
parentfb49b1af911ded218b3b3a84c784be2542c53e86 (diff)
downloadhaskell-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.h78
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 */