module NHC.Binary ( copyBin ) where import NHC.GreenCard import BinHandle ({-type-}BinHandle(..)) import BinLocation ({-type-}BinLocation) import OpenBin (openBin) import SizeBin (sizeBin) %-#include "cLowBinary.h" -- %-#include copyBin :: BinHandle -> BinLocation -> IO BinHandle copyBin sbh loc = openBin loc >>= \dbh-> sizeBin sbh >>= \nbytes-> copyBinAux sbh dbh nbytes >> return dbh %fun copyBinAux :: BinHandle -> BinHandle -> Int -> IO () %call (binHandle sbh) (binHandle dbh) (int bytes) %code % closecache(sbh); % closecache(dbh); % if (sbh->file) { % lseek(sbh->loc.fd,0,SEEK_SET); % if (dbh->file) { % /*FILE->FILE*/ % char buf[BUFSIZ]; % lseek(dbh->loc.fd,0,SEEK_SET); % while (bytes>BUFSIZ) { % read(sbh->loc.fd,buf,BUFSIZ); % write(dbh->loc.fd,buf,BUFSIZ); % bytes -= BUFSIZ; % } % if (bytes) { % read(sbh->loc.fd,buf,bytes); % write(dbh->loc.fd,buf,bytes); % } % } else { % /*FILE->MEM*/ % memcheck(dbh,bytes); % read(sbh->loc.fd, (void*)(stableRef(dbh->loc.sp)+1+EXTRA), bytes); % /*fprintf(stderr,"copyBin: %d bytes from file to mem at 0x%x\n", bytes, % (void*)(stableRef(dbh->loc.sp)+1+EXTRA));*/ % dbh->adjust.here = bytes; % } % } else { % if (dbh->file) { % /*MEM->FILE*/ % lseek(dbh->loc.fd,0,SEEK_SET); % write(dbh->loc.fd, (void*)(stableRef(sbh->loc.sp)+1+EXTRA), bytes); % /*fprintf(stderr,"copyBin: %d bytes from mem at 0x%x to file\n", bytes, % (void*)(stableRef(sbh->loc.sp)+1+EXTRA));*/ % } else { % /*MEM->MEM*/ % memcheck(dbh,bytes); % memcpy((void*)(stableRef(dbh->loc.sp)+1+EXTRA), % (void*)(stableRef(sbh->loc.sp)+1+EXTRA), bytes); % dbh->adjust.here = bytes; % } % sbh->adjust.here = bytes; % } % dbh->highwater = sbh->highwater; % opencache(sbh); % opencache(dbh); % /* POSTCONDITION: current pointer at *end* in both source and destination */ %result ()