5 IOFileObjects are used as part of the IO.Handle
6 implementation, ensuring that when handles are
7 finalised, buffers are flushed and FILE* objects
8 are closed (we really should be using file descriptors
13 typedef struct _IOFileObject {
17 int bufWPtr; /* points to next position to write,
18 bufRPtr >= bufWPtr <= bufSize.
20 For read-only files, bufWPtr = bufSize
22 bufWPtr = 0 => buffer is empty.
25 int bufRPtr; /* points to the next char to read
26 -1 >= bufRPtr <= bufWPtr
28 For write-only files, bufRPtr = 0
30 bufRPtr == -1 => buffer is empty.
34 struct _IOFileObject* connectedTo;
41 #define FILEOBJ_READ 16
42 #define FILEOBJ_WRITE 32
43 #define FILEOBJ_STD 64
44 /* The next two flags are used for RW file objects only.
45 They indicate whether the last operation was a read or a write.
46 (Need this info to determine whether a RW file object's
47 buffer should be flushed before doing a subsequent
50 #define FILEOBJ_RW_READ 256
51 #define FILEOBJ_RW_WRITE 512
53 * Under Win32, a file fd is not the same as a socket fd, so
54 * we need to use separate r/w calls.
56 #define FILEOBJ_WINSOCK 1024
57 #define FILEOBJ_BINARY 2048
59 #define FILEOBJ_IS_EOF(x) ((x)->flags & FILEOBJ_EOF)
60 #define FILEOBJ_SET_EOF(x) ((x)->flags |= FILEOBJ_EOF)
61 #define FILEOBJ_CLEAR_EOF(x) ((x)->flags &= ~FILEOBJ_EOF)
62 #define FILEOBJ_CLEAR_ERR(x) FILEOBJ_CLEAR_EOF(x)
64 #define FILEOBJ_BLOCKED_READ -5
65 #define FILEOBJ_BLOCKED_WRITE -6
66 #define FILEOBJ_BLOCKED_CONN_WRITE -7
68 #define FILEOBJ_UNBUFFERED(x) (!((x)->flags & FILEOBJ_LB) && !((x)->flags & FILEOBJ_BB))
69 #define FILEOBJ_LINEBUFFERED(x) ((x)->flags & FILEOBJ_LB)
70 #define FILEOBJ_BLOCKBUFFERED(x) ((x)->flags & FILEOBJ_BB)
71 #define FILEOBJ_BUFFER_FULL(x) ((x)->bufWPtr >= (x)->bufSize)
72 #define FILEOBJ_BUFFER_EMPTY(x) ((x)->bufRPtr == (x)->bufWPtr)
73 #define FILEOBJ_HAS_PUSHBACKS(x) ((x)->buf != NULL && (x)->bufRPtr >= 0 && (x)->bufRPtr < (x)->bufWPtr)
74 #define FILEOBJ_READABLE(x) ((x)->flags & FILEOBJ_READ)
75 #define FILEOBJ_WRITEABLE(x) ((x)->flags & FILEOBJ_WRITE)
76 #define FILEOBJ_JUST_READ(x) ((x)->flags & FILEOBJ_RW_READ)
77 #define FILEOBJ_JUST_WRITTEN(x) ((x)->flags & FILEOBJ_RW_WRITE)
78 #define FILEOBJ_NEEDS_FLUSHING(x) (!FILEOBJ_BUFFER_EMPTY(x))
79 #define FILEOBJ_RW(x) (FILEOBJ_READABLE(x) && FILEOBJ_WRITEABLE(x))
81 #endif /* FILEOBJECT_H */