closer-to-vc7-support-20030528
[openafs.git] / src / WINNT / afsd / largeintdotnet.c
1 /* 
2  * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved
3  *
4  * (C) COPYRIGHT IBM CORPORATION 1987, 1988
5  * LICENSED MATERIALS - PROPERTY OF IBM
6  *
7  */
8
9 /* Copyright (C) 1994 Cazamar Systems, Inc. */
10
11 #include <afs/param.h>
12 #include <afs/stds.h>
13
14 #include <windows.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <assert.h>
18 #include <limits.h>
19
20 #if (_MSC_VER >= 1300)
21 LARGE_INTEGER LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b)
22
23         LARGE_INTEGER result;
24         int carry;
25         result.LowPart=a.LowPart+b.LowPart;
26         carry=(result.LowPart < b.LowPart) ? 1 : 0;
27         result.HighPart=a.HighPart+b.HighPart+ carry;
28         return result;
29 }
30 LARGE_INTEGER LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b)
31
32         LARGE_INTEGER result;
33         int borrow;
34         result.LowPart=a.LowPart-b.LowPart;
35         borrow=(result.LowPart > a.LowPart) ? 1 : 0;
36         result.HighPart=a.HighPart-b.HighPart- borrow;
37         return result;
38 }
39 LARGE_INTEGER ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder)
40 {
41         LARGE_INTEGER result;
42         ULONGLONG a1,q1,r1;
43
44     result.HighPart=0;
45     result.LowPart=0;
46     if (b == 0) { return result; }
47     if (b == 1) { *remainder = 0; return a; }
48
49         a1=(a.HighPart << 32) | a.LowPart;
50         q1=a1/b;
51         r1=a1-(q1*b);
52         if (r1 > ULONG_MAX) /*XXX */;
53         result.HighPart=q1 >> 32;
54         result.LowPart=q1 & 0xffffffff;
55         *remainder=r1 & 0xffffffff;
56         return result;
57 }
58 LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder)
59 {
60         LARGE_INTEGER result;
61         ULONGLONG a1,b1,q1,r1;
62
63     result.HighPart=0;
64     result.LowPart=0;
65     if (b.HighPart == 0 && b.LowPart == 0) { return result; }
66     if (b.HighPart == 0 && b.LowPart == 1) { 
67                 remainder->HighPart = 0; 
68                 remainder->LowPart = 0;
69                 return a; 
70         }
71
72         a1=(a.HighPart << 32) | a.LowPart;
73         b1=(b.HighPart << 32) | a.LowPart;
74         q1=a1/b1;
75         r1=a1-(q1*b1);
76         result.HighPart=q1 >> 32;
77         result.LowPart=q1 & 0xffffffff;
78         remainder->HighPart=r1 >> 32;
79         remainder->LowPart=r1 & 0xffffffff;
80         return result;
81 }
82
83 LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) 
84 {
85         LARGE_INTEGER result;
86         result.HighPart=0;
87         result.LowPart=a;
88         return result;
89 }
90 #endif