| 1 | /* | 
 
 
 
 
 | 2 | largeint.h | 
 
 
 
 
 | 3 |  | 
 
 
 
 
 | 4 | Header for 64 bit integer arithmetics library | 
 
 
 
 
 | 5 |  | 
 
 
 
 
 | 6 | */ | 
 
 
 
 
 | 7 | #ifndef _LARGEINT_H | 
 
 
 
 
 | 8 | #define _LARGEINT_H | 
 
 
 
 
 | 9 | #if __GNUC__ >=3 | 
 
 
 
 
 | 10 | #pragma GCC system_header | 
 
 
 
 
 | 11 | #endif | 
 
 
 
 
 | 12 |  | 
 
 
 
 
 | 13 | #include <windows.h> | 
 
 
 
 
 | 14 |  | 
 
 
 
 
 | 15 | #ifdef __cplusplus | 
 
 
 
 
 | 16 | extern "C" { | 
 
 
 
 
 | 17 | #endif | 
 
 
 
 
 | 18 |  | 
 
 
 
 
 | 19 | #ifdef _HAVE_INT64 | 
 
 
 
 
 | 20 | #define _toi (__int64) | 
 
 
 
 
 | 21 | #define _toui (unsigned __int64) | 
 
 
 
 
 | 22 | #else | 
 
 
 
 
 | 23 | #error "64 bit integers not supported" | 
 
 
 
 
 | 24 | #endif | 
 
 
 
 
 | 25 |  | 
 
 
 
 
 | 26 | /* | 
 
 
 
 
 | 27 | We don't let the compiler see the prototypes if we are compiling the | 
 
 
 
 
 | 28 | library because if it does it will choke on conflicting types in the | 
 
 
 
 
 | 29 | prototypes. | 
 
 
 
 
 | 30 | */ | 
 
 
 
 
 | 31 |  | 
 
 
 
 
 | 32 | #if defined(LARGEINT_PROTOS) || defined(__COMPILING_LARGEINT) | 
 
 
 
 
 | 33 |  | 
 
 
 
 
 | 34 | #ifndef __COMPILING_LARGEINT | 
 
 
 
 
 | 35 | /* addition/subtraction */ | 
 
 
 
 
 | 36 | LARGE_INTEGER WINAPI LargeIntegerAdd (LARGE_INTEGER, LARGE_INTEGER); | 
 
 
 
 
 | 37 | LARGE_INTEGER WINAPI LargeIntegerSubtract (LARGE_INTEGER, LARGE_INTEGER); | 
 
 
 
 
 | 38 |  | 
 
 
 
 
 | 39 | /* bit operations */ | 
 
 
 
 
 | 40 | LARGE_INTEGER WINAPI LargeIntegerArithmeticShift (LARGE_INTEGER, int); | 
 
 
 
 
 | 41 | LARGE_INTEGER WINAPI LargeIntegerShiftLeft (LARGE_INTEGER, int); | 
 
 
 
 
 | 42 | LARGE_INTEGER WINAPI LargeIntegerShiftRight (LARGE_INTEGER, int); | 
 
 
 
 
 | 43 | LARGE_INTEGER WINAPI LargeIntegerNegate (LARGE_INTEGER); | 
 
 
 
 
 | 44 |  | 
 
 
 
 
 | 45 | /* conversion */ | 
 
 
 
 
 | 46 | LARGE_INTEGER WINAPI ConvertLongToLargeInteger (LONG); | 
 
 
 
 
 | 47 | LARGE_INTEGER WINAPI ConvertUlongToLargeInteger (ULONG); | 
 
 
 
 
 | 48 |  | 
 
 
 
 
 | 49 | /* multiplication */ | 
 
 
 
 
 | 50 | LARGE_INTEGER WINAPI EnlargedIntegerMultiply (LONG, LONG); | 
 
 
 
 
 | 51 | LARGE_INTEGER WINAPI EnlargedUnsignedMultiply (ULONG, ULONG); | 
 
 
 
 
 | 52 | LARGE_INTEGER WINAPI ExtendedIntegerMultiply (LARGE_INTEGER, LONG); | 
 
 
 
 
 | 53 | /* FIXME: is this not part of largeint? */ | 
 
 
 
 
 | 54 | LARGE_INTEGER WINAPI LargeIntegerMultiply (LARGE_INTEGER, LARGE_INTEGER); | 
 
 
 
 
 | 55 | #endif /* __COMPILING_LARGEINT */ | 
 
 
 
 
 | 56 |  | 
 
 
 
 
 | 57 | #else | 
 
 
 
 
 | 58 |  | 
 
 
 
 
 | 59 | #define LargeIntegerAdd(a,b) (LARGE_INTEGER)(_toi(a) + _toi(b)) | 
 
 
 
 
 | 60 | #define LargeIntegerSubtract(a,b) (LARGE_INTEGER)(_toi(a) - _toi(b)) | 
 
 
 
 
 | 61 | #define LargeIntegerRightShift(i,n) (LARGE_INTEGER)(_toi(i) >> (n)) | 
 
 
 
 
 | 62 | #define LargeIntegerArithmeticShift LargeIntegerRightShift | 
 
 
 
 
 | 63 | #define LargeIntegerLeftShift(i,n) (LARGE_INTEGER)(_toi(i) << (n)) | 
 
 
 
 
 | 64 | #define LargeIntegerNegate(i) (LARGE_INTEGER)(- _toi(i)) | 
 
 
 
 
 | 65 | #define EnlargedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) | 
 
 
 
 
 | 66 | #define EnlargedUnsignedMultiply(a,b) (LARGE_INTEGER)(_toui(a) * _toui(b)) | 
 
 
 
 
 | 67 | #define ExtendedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) | 
 
 
 
 
 | 68 | /* FIXME: should this exist */ | 
 
 
 
 
 | 69 | #define LargeIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) | 
 
 
 
 
 | 70 | #define ConvertLongToLargeInteger(l) (LARGE_INTEGER)(_toi(l)) | 
 
 
 
 
 | 71 | #define ConvertUlongToLargeInteger(ul) (LARGE_INTEGER)(_toui(ul)) | 
 
 
 
 
 | 72 |  | 
 
 
 
 
 | 73 | #endif /* LARGEINT_PROTOS || __COMPILING_LARGEINT */ | 
 
 
 
 
 | 74 |  | 
 
 
 
 
 | 75 | #ifndef __COMPILING_LARGEINT | 
 
 
 
 
 | 76 | /* division; no macros of these because of multiple expansion */ | 
 
 
 
 
 | 77 | LARGE_INTEGER WINAPI LargeIntegerDivide (LARGE_INTEGER, LARGE_INTEGER, PLARGE_INTEGER); | 
 
 
 
 
 | 78 | ULONG WINAPI EnlargedUnsignedDivide (ULARGE_INTEGER, ULONG, PULONG); | 
 
 
 
 
 | 79 | LARGE_INTEGER WINAPI ExtendedLargeIntegerDivide (LARGE_INTEGER, ULONG, PULONG); | 
 
 
 
 
 | 80 | LARGE_INTEGER WINAPI ExtendedMagicDivide (LARGE_INTEGER, LARGE_INTEGER, int); | 
 
 
 
 
 | 81 | #endif /* __COMPILING_LARGEINT */ | 
 
 
 
 
 | 82 |  | 
 
 
 
 
 | 83 | #define LargeIntegerAnd(dest, src, m) \ | 
 
 
 
 
 | 84 | { \ | 
 
 
 
 
 | 85 | dest._STRUCT_NAME(u.)LowPart = s._STRUCT_NAME(u.)LowPart & m._STRUCT_NAME(u.)LowPart; \ | 
 
 
 
 
 | 86 | dest._STRUCT_NAME(u.)HighPart = s._STRUCT_NAME(u.)HighPart & m._STRUCT_NAME(u.)HighPart; \ | 
 
 
 
 
 | 87 | } | 
 
 
 
 
 | 88 |  | 
 
 
 
 
 | 89 | /* comparision */ | 
 
 
 
 
 | 90 | #define LargeIntegerGreaterThan(a,b) (_toi(a) > _toi(b)) | 
 
 
 
 
 | 91 | #define LargeIntegerGreaterThanOrEqual(a,b) (_toi(a) >= _toi(b)) | 
 
 
 
 
 | 92 | #define LargeIntegerEqualTo(a,b) (_toi(a) == _toi(b)) | 
 
 
 
 
 | 93 | #define LargeIntegerNotEqualTo(a,b) (_toi(a) != _toi(b)) | 
 
 
 
 
 | 94 | #define LargeIntegerLessThan(a,b) (_toi(a) < _toi(b)) | 
 
 
 
 
 | 95 | #define LargeIntegerLessThanOrEqualTo(a,b) (_toi(a) <= _toi(b)) | 
 
 
 
 
 | 96 | #define LargeIntegerGreaterThanZero(a) (_toi(a) > 0) | 
 
 
 
 
 | 97 | #define LargeIntegerGreaterOrEqualToZero(a) ((a)._STRUCT_NAME(u.)HighPart > 0) | 
 
 
 
 
 | 98 | #define LargeIntegerEqualToZero(a) !((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart) | 
 
 
 
 
 | 99 | #define LargeIntegerNotEqualToZero(a) ((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart) | 
 
 
 
 
 | 100 | #define LargeIntegerLessThanZero(a) ((a)._STRUCT_NAME(u.)HighPart < 0) | 
 
 
 
 
 | 101 | #define LargeIntegerLessOrEqualToZero(a) (_toi(a) <= 0) | 
 
 
 
 
 | 102 |  | 
 
 
 
 
 | 103 | #ifndef __COMPILING_LARGEINT | 
 
 
 
 
 | 104 | #undef _toi | 
 
 
 
 
 | 105 | #undef _toui | 
 
 
 
 
 | 106 | #endif | 
 
 
 
 
 | 107 |  | 
 
 
 
 
 | 108 | #ifdef __cplusplus | 
 
 
 
 
 | 109 | } | 
 
 
 
 
 | 110 | #endif | 
 
 
 
 
 | 111 |  | 
 
 
 
 
 | 112 | #endif /* _LARGEINT_H */ |