module NHC.Binary
( copyBytes
) where
import NHC.GreenCard
import BinHandle ({-type-}BinHandle(..))
import BinPtr ({-type-}BinPtr(..))
%-#include "cLowBinary.h"
-- %-#include <stdio.h>
%fun copyBytes :: BinHandle -> BinHandle -> Int -> IO BinPtr
%call (binHandle sbh) (binHandle dbh) (int bytes)
%code /* The source bitstream is assumed to be aligned to a */
% /* byte boundary (at both ends) */
% destptr = (dbh->file ? vtell(dbh) : mtell(dbh));
% if ((destptr+(bytes*8)) > dbh->highwater) dbh->highwater = destptr+(bytes*8);
% closecache(sbh);
% closecache(dbh);
% if (sbh->file) {
% vsync(sbh);
% if (dbh->file) {
% /*FILE->FILE*/
% char buf[BUFSIZ];
% vsync(dbh);
% 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)+dbh->adjust.here, bytes);
% dbh->adjust.here += bytes;
% if (dbh->adjust.here > dbh->attrib.size)
% dbh->attrib.size = dbh->adjust.here;
% /*fprintf(stderr,"directPut: %d bytes from file to mem at 0x%x\n", bytes,
% (void*)(stableRef(dbh->loc.sp)+1+EXTRA)+dbh->adjust.here);*/
% }
% } else {
% if (dbh->file) {
% /*MEM->FILE*/
% vsync(dbh);
% write(dbh->loc.fd,
% (void*)(stableRef(sbh->loc.sp)+1+EXTRA)+sbh->adjust.here, bytes);
% /*fprintf(stderr,"directPut: %d bytes from mem at 0x%x to file\n", bytes,
% (void*)(stableRef(sbh->loc.sp)+1+EXTRA)+sbh->adjust.here);*/
% } else {
% /*MEM->MEM*/
% memcheck(dbh,bytes);
% memcpy((void*)(stableRef(dbh->loc.sp)+1+EXTRA)+dbh->adjust.here,
% (void*)(stableRef(sbh->loc.sp)+1+EXTRA)+sbh->adjust.here, bytes);
% dbh->adjust.here += bytes;
% if (dbh->adjust.here > dbh->attrib.size)
% dbh->attrib.size = dbh->adjust.here;
% }
% }
% opencache(sbh);
% opencache(dbh);
%result (binPtr destptr)
|