module NHC.Binary
( clearBits
) where
import NHC.GreenCard
import BinHandle ({-type-}BinHandle(..))
import BinPtr ({-type-}BinPtr(..))
%-#include "cLowBinary.h"
-- %-#include <stdio.h>
%fun clearBits :: BinHandle -> Int -> IO BinPtr
%call (binHandle bh) (int width)
%code /* code based closely on putBits */
% p = (bh->file ? vtell(bh) : mtell(bh));
% if (bh->highwater < p+width) bh->highwater = p+width;
% while (width > 0) {
% int byte = bh->cptr / 8;
% int avail = 8 - (bh->cptr % 8);
% if (width >= avail) {
% bh->cache[byte] = lhs(8-avail,bh->cache[byte]);
% bh->cptr += avail;
% width -= avail;
% bh->w = ((bh->w > byte+1) ? bh->w : byte+1);
% if ((byte+1) == CACHESIZE) nextcache(bh);
% } else {
% int rsegment = avail-width;
% bh->cache[byte] = lhs(8-avail,bh->cache[byte])
% | rhs(rsegment,bh->cache[byte]);
% bh->cptr += width;
% width = 0;
% bh->w = ((bh->w > byte+1) ? bh->w : byte+1);
% }
% }
%result (binPtr p)
|