/************************************************************** * * File : cutils.h * Owner : Mark Brehob * Writen by : Suresh Chittor * Version : 4.0 * Copy Date : 3/15/94 * Last Edit : 4/16/96 * ***************************************************************/ /* WARNING!!! This is really ugly code! */ #include FILE * hobopen(char filename[],char type[]); int hobclose(FILE *stream); /* We have two cases. If we have seen this file before then */ /* we declare the two arrays as extern. Otherwise we do it */ /* normally */ #ifndef __cutils_h__ typedef unsigned int bits; #endif bits lomask[32]; bits himask[32]; #ifndef __cutils_h__ #define __cutils_h__ typedef unsigned long int ulint; /****************BIT FUNCTIONS*********************** * The following macros are designed to allow bit and bit-field manipulation * in a "bits" data variable. * * mask(lo,hi) a field of 1's from bits lo to hi, inclusive * fld(data,lo,hi) extract the bit field, and right justify * * bit(data,i) return the single bit i from data, right justified * byte(data,i) return byte number i from data, right justified * half(data,i) return half-word number i from data, right justified * * setb(data,i) set bit i in data * clearb(data,i) clear bit i in data * loadb(data,i,b) load bit i in data with value b * loadf(data,i,j,f) load field [i:j] in data with value f */ bits lomask[32] = { 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF }; bits himask[32] = { 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFC, 0xFFFFFFF8, 0xFFFFFFF0, 0xFFFFFFE0, 0xFFFFFFC0, 0xFFFFFF80, 0xFFFFFF00, 0xFFFFFE00, 0xFFFFFC00, 0xFFFFF800, 0xFFFFF000, 0xFFFFE000, 0xFFFFC000, 0xFFFF8000, 0xFFFF0000, 0xFFFE0000, 0xFFFC0000, 0xFFF80000, 0xFFF00000, 0xFFE00000, 0xFFC00000, 0xFF800000, 0xFF000000, 0xFE000000, 0xFC000000, 0xF8000000, 0xF0000000, 0xE0000000, 0xC0000000, 0x80000000 }; #define bmask(lo,hi) (lomask[hi] & himask[lo]) #define fld(data,lo,hi) (((data) & bmask((lo),(hi))) >> (lo)) #define bit(data,i) (((data)>>(i))&1) #define byte(data,i) (((data)>>((i)*8))&0xFF) #define half(data,i) (((data)>>((i)*16))&0xFFFF) #define setb(data,i) ((data) |= (1<<(i))) #define clearb(data,i) ((data) &=~(1<<(i))) #define compb(data,i) ((data) ^= (1<<(i))) #define loadb(data,i,b) (data)=((data)&~(1<<(i))) | ((b)<<(i)) #define loadf(data,i,j,fld) (data)=((data)&~bmask(i,j))|((fld<<(i))&bmask(i,j)) /********** More useful macros *********************************/ #define range(lo,x,hi) (lo<=x && x<=hi) #ifndef abs #define abs(x) ((x) < 0 ? -(x) : (x)) #endif #ifndef min #define min(a,b) ((a) <= (b) ? (a) : (b)) #endif #ifndef max #define max(a,b) ((a) >= (b) ? (a) : (b)) #endif #ifndef mod #define mod(x,y) max((x)%(y),(-x)%(y)) #endif /* #ifndef __brev__ #define __brev__ unsigned long int brev(unsigned long int a,int l) { int i; int b=a; for(i=0;i