/* cLowBinary.h - Useful definitions for the new Binary functions. */ #include #include #define RO 0 #define WO 1 #define RW 2 #define CACHESIZE 1024 #define rhs(size,byte) (byte & ~((unsigned char)0xff<<(size))) #define lhs(size,byte) (byte & ((unsigned char)0xff<<(8-(size)))) #include "stableptr.h" /*typedef int HaskellRef;*/ typedef struct { int mode; /* values: RO, WO, RW */ int file; /* values: False==Memory, True==File */ union { HaskellRef sp; /* StablePtr to start of node */ int fd; /* unbuffered file descriptor */ } loc; union { int here; /* offset to first cached *byte* within node */ int vptr; /* virtual file position (relative to actual) */ } adjust; union { int size; /* amount of space allocated in node (in bytes) */ int eof; /* #bytes missing from end of cache when eof encountered */ } attrib; unsigned char cache[CACHESIZE]; int w; /* cache written into? (max byteno from start of cache) */ int cptr; /* bit offset in cache */ int highwater; /* first unused bit beyond end of BinHandle */ } BinState, *BinHandle; #define vtell(bh) ((8 * (lseek(bh->loc.fd,0,SEEK_CUR) + bh->adjust.vptr)) \ + bh->cptr) #define vsync(bh) if (bh->adjust.vptr) { \ /* relative seek */ \ lseek(bh->loc.fd,bh->adjust.vptr,SEEK_CUR); \ bh->adjust.vptr = 0; \ } #define mtell(bh) ((8 * bh->adjust.here) + bh->cptr) extern void clearcache (BinHandle); extern void vread (BinHandle); extern void vwrite (BinHandle); extern void mread (BinHandle); extern void mwrite (BinHandle); extern void nextcache (BinHandle); extern void opencache (BinHandle); extern void closecache (BinHandle); extern int forceCacheTo (BinHandle,int); extern void memcheck (BinHandle,int); extern void finaliseBH (BinHandle); extern void preFinaliseBH(BinHandle); #define BUFFER 100 #include "cinterface.h" #ifndef BUFSIZ #define BUFSIZ 1024 #endif