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

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


module NHC.Binary
  ( directGet
  ) where

import NHC.GreenCard
import BinHandle ({-type-}BinHandle(..))
import SizedBin  ({-type-}Size(..))
import BinPtr   ({-type-}BinPtr(..))

%-#include "cLowBinary.h"
    -- %-#include <stdio.h>
    -- %-#include <errno.h>

%fun directGet :: BinHandle -> Size -> BinHandle -> IO BinPtr
%call (binHandle sbh) (Size (int size)) (binHandle dbh)
%code  /* The BinPtr component in a SizedBin is always aligned to a */
%      /* byte boundary (at both ends) */
%
%  int bytes = (size%8 ? (size/8)+1 : (size/8));
%  /* fprintf(stderr,"directGet: size=%d vtell=%d bytes=%d ",
%                  size,vtell(bh),bytes); */
%  /* build return value */
%  p = (dbh->file ? vtell(dbh) : mtell(dbh));
%  closecache(sbh);
%  closecache(dbh);
%  if (sbh->file {
%    if (dbh->file) {
%      /*FILE->FILE*/
%    } else {
%      /*FILE->MEM*/
%    }
%  } else {
%    if (dbh->file) {
%      /*MEM->FILE*/
%    } else {
%      /*MEM->MEM*/
%    }
%  }
%
%  b = mkBin(wordPtr,bitIndx);  /* binSpace is assumed already aligned */
%  if ((CACHESIZE - (bh->cptr/8) - bytes) >= 0) {
%    /* read from cache */
%    memcpy(((char*)(&binSpace[0]))+(b/8),&bh->cache[bh->cptr/8],bytes);
%    bh->cptr += bytes*8;
%    /* fprintf(stderr,"read from cache\n   "); */
%  } else {
%    /* use real file ops, not virtual ones! */
%    closecache(bh);
%    vsync(bh);
%    /* fprintf(stderr,"filetell=%d ",lseek(bh->fd,0,SEEK_CUR)); */
%    /* fprintf(stderr,"bh->vptr=%d bh->cptr=%d ",bh->vptr,bh->cptr); */
%    err = read(bh->fd,((char*)(&binSpace[0]))+(b/8),bytes);
%    /* if (err==0) fprintf(stderr,"errno=%d ",errno); */
%    opencache(bh);
%  }
%  /* update write-pointers into binSpace */
%  wordPtr = wordPtrOf(b+size);
%  bitIndx = bitIndxOf(b+size);
%  /* fprintf(stderr,"binpos=%d value=%d err=%d\n",
%                  b, *(((char*)(&binSpace[0]))+(b/8)), err); */
%  #endif
%result (binPtr p)


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].