2 * Collection of basic tools and defines
15 // Generates an error if __WORDSIZE is not defined
17 #error Missing definition of __WORDSIZE; Please define __WORDSIZE in Tools.h!
20 // Check word length on GNU C/C++:
21 // __WORDSIZE should be defined in <bits/wordsize.h>, which is #included from <limits.h>
33 #define Wminusone (W-1)
37 #define uchar unsigned char
40 #define ulong unsigned long
43 #define myminofthree(x,y,z) (x)<(y)?((x)<(z)?(x):(z)):(y)<(z)?(y):(z)
49 static time_t startTime;
51 static void StartTimer();
52 static double GetTime();
53 static uchar * GetRandomString(unsigned, unsigned, unsigned &);
54 static void PrintBitSequence(ulong *, ulong);
55 static uchar * GetFileContents(char *, ulong =0);
56 static ulong * bp2bitstream(uchar *);
57 static unsigned FloorLog2(ulong);
58 static unsigned CeilLog2(ulong);
59 static unsigned bits (ulong);
61 static inline void SetField(ulong *A, register unsigned len, register ulong index, register ulong x)
63 ulong i = index * len / W,
64 j = index * len - i * W;
65 ulong mask = (j+len < W ? ~0lu << (j+len) : 0)
66 | (W-j < W ? ~0lu >> (W-j) : 0);
67 A[i] = (A[i] & mask) | x << j;
70 mask = ((~0lu) << (len + j - W));
71 A[i+1] = (A[i+1] & mask)| x >> (W - j);
75 static inline ulong GetField(ulong *A, register unsigned len, register ulong index)
77 register ulong i = index * len / W,
78 j = index * len - W * i,
81 result = (A[i] << (W - j - len)) >> (W - len);
85 result = result | (A[i+1] << (WW - j - len)) >> (W - len);
91 static inline ulong GetVariableField(ulong *A, register unsigned len, register ulong index)
93 register ulong i=index/W, j=index-W*i, result;
95 result = (A[i] << (W-j-len)) >> (W-len);
98 result = result | (A[i+1] << (WW-j-len)) >> (W-len);
103 static inline void SetVariableField(ulong *A, register unsigned len, register ulong index, register ulong x) {
106 ulong mask = (j+len < W ? ~0lu << (j+len) : 0)
107 | (W-j < W ? ~0lu >> (W-j) : 0);
108 A[i] = (A[i] & mask) | x << j;
110 mask = ((~0lu) << (len+j-W));
111 A[i+1] = (A[i+1] & mask)| x >> (W-j);