module NHC.Binary ( compareBin ) where import NHC.GreenCard import BinPtr import BinHandle %-#include "cLowBinary.h" %-#include -- %-#include %dis ordering x = (int x) %-#define LT 0 %-#define EQ 1 %-#define GT 2 %fun compareBin :: Int -> Int -> BinHandle -> BinPtr -> BinHandle -> BinPtr -> Ordering %call (int sizex) (int sizey) (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 */ % int bytex = (sizex%8 ? (sizex/8)+1 : sizex/8); % int bytey = (sizey%8 ? (sizey/8)+1 : sizey/8); % int xptr, yptr; % if ((bhx->mode != RO) || (bhy->mode != RO)) { % fprintf(stderr,"Binary.compareBin: BinHandle is not Read-Only."); % exit(1); % } % xptr = (x - forceCacheTo(bhx,x)) / 8; % yptr = (y - forceCacheTo(bhy,y)) / 8; % /* fprintf(stderr,"compareBin: sizex=%d sizey=%d xoffset=%d yoffset=%d\n", % sizex,sizey,x,y); */ % retval = EQ; % while (bytex-- && bytey--) { % if (bhx->cache[xptr] != bhy->cache[yptr]) { % if (bhx->cache[xptr] < bhy->cache[yptr]) { % retval = LT; % } else { % retval = GT; % } % break; % } % xptr++; yptr++; % if (xptr==CACHESIZE) nextcache(bhx); % if (yptr==CACHESIZE) nextcache(bhy); % } %result (ordering retval)