module NHC.Binary ( equalsBin ) where import NHC.GreenCard import BinPtr import BinHandle %-#include "cLowBinary.h" %fun equalsBin :: Int -> BinHandle -> BinPtr -> BinHandle -> BinPtr -> Bool %call (int size) (binHandle bhx) (binPtr x) (binHandle bhy) (binPtr y) %code % /* size of x and y are not necessarily byte-aligned */ % /* but bits of x and y are guaranteed byte-aligned at both ends */ % unsigned int bytes = (size%8 ? size/8+1 : size/8); % int xptr, yptr; % xptr = (x - forceCacheTo(bhx,x)) / 8; % yptr = (y - forceCacheTo(bhy,y)) / 8; % retval = 1; % while (bytes--) { % if (bhx->cache[xptr] != bhy->cache[yptr]) { % retval = 0; % break; % } % xptr++; yptr++; % if (xptr==CACHESIZE) nextcache(bhx); % if (yptr==CACHESIZE) nextcache(bhy); % } %result (bool retval)