module NHC.Binary
( openBin
) where
import NHC.GreenCard
import BinHandle ({-type-}BinHandle(..))
import BinIOMode ({-type-}BinIOMode(..))
import BinLocation ({-type-}BinLocation(..), fromBinLocation)
%-#include "cLowBinary.h"
%-#include <fcntl.h>
%-#include <stdlib.h>
%fun openBin :: BinLocation -> IO BinHandle
%call (binLocation f fp m)
%code
% bh = (BinHandle)malloc(sizeof(BinState)); /* assume unfailing */
% bh->mode = m;
% bh->file = f;
% bh->cptr = 0;
% if (bh->file) {
% switch (bh->mode) {
% case RO: bh->loc.fd = open(fp,O_RDONLY); break; /* ditto */
% case WO: bh->loc.fd = open(fp,(O_WRONLY|O_CREAT|O_TRUNC),0644); break;
% case RW: bh->loc.fd = open(fp,(O_RDWR|O_CREAT),0644); break;
% default: exit(1);
% } /* permissions 0644=-rw-r--r-- */
% bh->attrib.eof = 0;
% bh->adjust.vptr = 0;
% switch (bh->mode) {
% case WO: bh->highwater = 0;
% break;
% default: bh->highwater = 8 * lseek(bh->loc.fd,0,SEEK_END);
% if (bh->highwater>0) {
% char c=0;
% lseek(bh->loc.fd,-1,SEEK_END);
% read(bh->loc.fd,&c,1);
% bh->highwater -= (int)c;
% }
% break;
% }
% lseek(bh->loc.fd,0,SEEK_SET);
% } else {
% NodePtr n = C_ALLOC(1+EXTRA);
% n[0] = CONSTRW(0,EXTRA);
% bh->loc.sp = stableInsert(n);
% bh->attrib.size = 0;
% bh->adjust.here = 0;
% bh->highwater = 0;
% }
% opencache(bh);
%result (binHandle bh)
|