Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/src/prelude/Binary/CopyBin.gc

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


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 <stdio.h>

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 ()


Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].