From 14af9b39422089123f517db8a9655ea1bd10b1bb Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Wed, 28 May 2003 19:36:05 +0000 Subject: [PATCH] STABLE12-closer-to-vc7-support-20030528 FIXES 1334 VC7 dropped support for the LARGE_INTEGER functions (linking against largeint.lib doesn't seem to have any effect) (cherry picked from commit 5ecdab3b75c02784ae6d87e93a92d1a3f705c83d) --- src/WINNT/afsd/NTMakefile | 1 + src/WINNT/afsd/afsd_service.c | 2 +- src/WINNT/afsd/largeintdotnet.c | 90 +++++++++++++++++++++++++++++++++ src/WINNT/client_osi/osi.h | 33 ++++++++++++ src/WINNT/client_osi/osistatl.h | 2 + src/WINNT/client_osi/osiutils.c | 73 ++++++++++++++++++++++++++ 6 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 src/WINNT/afsd/largeintdotnet.c diff --git a/src/WINNT/afsd/NTMakefile b/src/WINNT/afsd/NTMakefile index da8bc97c1..edf83cd84 100644 --- a/src/WINNT/afsd/NTMakefile +++ b/src/WINNT/afsd/NTMakefile @@ -62,6 +62,7 @@ AFSDOBJS=\ cm_vnodeops.obj \ cm_dir.obj \ cm_utils.obj \ + largeintdotnet.obj \ smb.obj \ smb3.obj \ smb_ioctl.obj \ diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index 658851861..ed4cedeeb 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -283,7 +283,7 @@ void main() #else #ifdef _CRTAPI1 -void _CRTAPI1 main() +void _CRTAPI1 main(void) #else void main() #endif diff --git a/src/WINNT/afsd/largeintdotnet.c b/src/WINNT/afsd/largeintdotnet.c new file mode 100644 index 000000000..231182395 --- /dev/null +++ b/src/WINNT/afsd/largeintdotnet.c @@ -0,0 +1,90 @@ +/* + * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved + * + * (C) COPYRIGHT IBM CORPORATION 1987, 1988 + * LICENSED MATERIALS - PROPERTY OF IBM + * + */ + +/* Copyright (C) 1994 Cazamar Systems, Inc. */ + +#include +#include + +#include +#include +#include +#include +#include + +#if (_MSC_VER >= 1300) +LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b) +{ + LARGE_INTEGER result; + int carry; + result.LowPart=a.LowPart+b.LowPart; + carry=(result.LowPart < b.LowPart) ? 1 : 0; + result.HighPart=a.HighPart+b.HighPart+ carry; + return result; +} +LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b) +{ + LARGE_INTEGER result; + int borrow; + result.LowPart=a.LowPart-b.LowPart; + borrow=(result.LowPart > a.LowPart) ? 1 : 0; + result.HighPart=a.HighPart-b.HighPart- borrow; + return result; +} +LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder) +{ + LARGE_INTEGER result; + ULONGLONG a1,q1,r1; + + result.HighPart=0; + result.LowPart=0; + if (b == 0) { return result; } + if (b == 1) { *remainder = 0; return a; } + + a1=(a.HighPart << 32) | a.LowPart; + q1=a1/b; + r1=a1-(q1*b); + if (r1 > ULONG_MAX) /*XXX */; + result.HighPart=q1 >> 32; + result.LowPart=q1 & 0xffffffff; + *remainder=r1 & 0xffffffff; + return result; +} +LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder) +{ + LARGE_INTEGER result; + ULONGLONG a1,b1,q1,r1; + + result.HighPart=0; + result.LowPart=0; + if (b.HighPart == 0 && b.LowPart == 0) { return result; } + if (b.HighPart == 0 && b.LowPart == 1) { + remainder->HighPart = 0; + remainder->LowPart = 0; + return a; + } + + a1=(a.HighPart << 32) | a.LowPart; + b1=(b.HighPart << 32) | a.LowPart; + q1=a1/b1; + r1=a1-(q1*b1); + result.HighPart=q1 >> 32; + result.LowPart=q1 & 0xffffffff; + remainder->HighPart=r1 >> 32; + remainder->LowPart=r1 & 0xffffffff; + return result; +} + +LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) +{ + LARGE_INTEGER result; + result.HighPart=0; + result.LowPart=a; + return result; +} +#endif diff --git a/src/WINNT/client_osi/osi.h b/src/WINNT/client_osi/osi.h index 43b9aca34..58922d9a0 100644 --- a/src/WINNT/client_osi/osi.h +++ b/src/WINNT/client_osi/osi.h @@ -18,13 +18,46 @@ /* large int */ #ifndef DJGPP #include +#if !defined(_MSC_VER) || (_MSC_VER < 1300) #include +#endif #include "osithrdnt.h" #else /* DJGPP */ #include "largeint95.h" #endif /* !DJGPP */ typedef LARGE_INTEGER osi_hyper_t; +#if _MSC_VER >= 1300 +LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b); +LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b); +LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder); +LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder); +LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a); +#define LargeIntegerGreaterThan(a, b) \ + ((a).HighPart > (b).HighPart || \ + ((a).HighPart == (b).HighPart && (a).LowPart > (b).LowPart)) + +#define LargeIntegerGreaterThanOrEqualTo(a, b) \ + ((a).HighPart > (b).HighPart || \ + ((a).HighPart == (b).HighPart && (a).LowPart >= (b).LowPart)) + +#define LargeIntegerLessThan(a, b) \ + ((a).HighPart < (b).HighPart || \ + ((a).HighPart == (b).HighPart && (a).LowPart < (b).LowPart)) + +#define LargeIntegerLessThanOrEqualTo(a, b) \ + ((a).HighPart < (b).HighPart || \ + ((a).HighPart == (b).HighPart && (a).LowPart <= (b).LowPart)) + +#define LargeIntegerEqualTo(a, b) \ + ((a).HighPart == (b).HighPart && (a).LowPart == (b).LowPart) + +#define LargeIntegerGreaterOrEqualToZero(a) ((a).HighPart >= 0) + +#define LargeIntegerLessThanZero(a) ((a).HighPart < 0) + +#define LargeIntegerNotEqualToZero(a) ((a).HighPart || (a).LowPart) +#endif #ifndef DJGPP typedef GUID osi_uid_t; #else /* DJGPP */ diff --git a/src/WINNT/client_osi/osistatl.h b/src/WINNT/client_osi/osistatl.h index 52435ca7b..e881afb9c 100644 --- a/src/WINNT/client_osi/osistatl.h +++ b/src/WINNT/client_osi/osistatl.h @@ -12,7 +12,9 @@ #define _OSISTATL_H_ENV_ 1 #include "osibasel.h" +#if !defined(_MSC_VER) || (_MSC_VER < 1300) #include +#endif #include "osiqueue.h" /* structure representing all information about someone holding a lock diff --git a/src/WINNT/client_osi/osiutils.c b/src/WINNT/client_osi/osiutils.c index 1f051fd08..848fe61f4 100644 --- a/src/WINNT/client_osi/osiutils.c +++ b/src/WINNT/client_osi/osiutils.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "osiutils.h" @@ -72,3 +73,75 @@ void __RPC_API MIDL_user_free(void *p) { free(p); } + +#if (_MSC_VER >= 1300) +LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b) +{ + LARGE_INTEGER result; + int carry; + result.LowPart=a.LowPart+b.LowPart; + carry=(result.LowPart < b.LowPart) ? 1 : 0; + result.HighPart=a.HighPart+b.HighPart+ carry; + return result; +} +LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b) +{ + LARGE_INTEGER result; + int borrow; + result.LowPart=a.LowPart-b.LowPart; + borrow=(result.LowPart > a.LowPart) ? 1 : 0; + result.HighPart=a.HighPart-b.HighPart- borrow; + return result; +} +LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder) +{ + LARGE_INTEGER result; + ULONGLONG a1,q1,r1; + + result.HighPart=0; + result.LowPart=0; + if (b == 0) { return result; } + if (b == 1) { *remainder = 0; return a; } + + a1=(a.HighPart << 32) | a.LowPart; + q1=a1/b; + r1=a1-(q1*b); + if (r1 > ULONG_MAX) /*XXX */; + result.HighPart=q1 >> 32; + result.LowPart=q1 & 0xffffffff; + *remainder=r1 & 0xffffffff; + return result; +} +LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder) +{ + LARGE_INTEGER result; + ULONGLONG a1,b1,q1,r1; + + result.HighPart=0; + result.LowPart=0; + if (b.HighPart == 0 && b.LowPart == 0) { return result; } + if (b.HighPart == 0 && b.LowPart == 1) { + remainder->HighPart = 0; + remainder->LowPart = 0; + return a; + } + + a1=(a.HighPart << 32) | a.LowPart; + b1=(b.HighPart << 32) | a.LowPart; + q1=a1/b1; + r1=a1-(q1*b1); + result.HighPart=q1 >> 32; + result.LowPart=q1 & 0xffffffff; + remainder->HighPart=r1 >> 32; + remainder->LowPart=r1 & 0xffffffff; + return result; +} + +LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) +{ + LARGE_INTEGER result; + result.HighPart=0; + result.LowPart=a; + return result; +} +#endif -- 2.39.5