windows-follow-backup-path-20080105
[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;
50     a1<<=32;
51     a1 |= a.LowPart;
52     q1=a1/b;
53     r1=a1-(q1*b);
54     if (r1 > ULONG_MAX) /*XXX */;
55     result.HighPart=(LONG)(q1 >> 32);
56     result.LowPart=(DWORD)(q1 & 0xffffffff);
57     *remainder=(unsigned long)(r1 & 0xffffffff);
58     return result;
59 }
60 LARGE_INTEGER LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder)
61 {
62     LARGE_INTEGER result;
63     ULONGLONG a1,b1,q1,r1;
64
65     result.HighPart=0;
66     result.LowPart=0;
67     if (b.HighPart == 0 && b.LowPart == 0) { return result; }
68     if (b.HighPart == 0 && b.LowPart == 1) { 
69         remainder->HighPart = 0; 
70         remainder->LowPart = 0;
71         return a; 
72     }
73
74     a1=a.HighPart;
75     a1<<=32;
76     a1|=a.LowPart;
77     b1=b.HighPart;
78     b1<<=32;
79     b1|=b.LowPart;
80     q1=a1/b1;
81     r1=a1-(q1*b1);
82     result.HighPart=(LONG)(q1 >> 32);
83     result.LowPart=(DWORD)(q1 & 0xffffffff);
84     remainder->HighPart=(LONG)(r1 >> 32);
85     remainder->LowPart=(DWORD)(r1 & 0xffffffff);
86     return result;
87 }       
88
89 LARGE_INTEGER ConvertLongToLargeInteger(unsigned long a) 
90 {
91     LARGE_INTEGER result;
92     result.HighPart=0;
93     result.LowPart=a;
94     return result;
95 }       
96 #endif