OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / user / unrar / int64.cpp
1 #include "rar.hpp"
2
3 #ifndef NATIVE_INT64
4
5 Int64::Int64()
6 {
7 }
8
9
10 Int64::Int64(uint n)
11 {
12   HighPart=0;
13   LowPart=n;
14 }
15
16
17 Int64::Int64(uint HighPart,uint LowPart)
18 {
19   Int64::HighPart=HighPart;
20   Int64::LowPart=LowPart;
21 }
22
23
24 /*
25 Int64 Int64::operator = (Int64 n)
26 {
27   HighPart=n.HighPart;
28   LowPart=n.LowPart;
29   return(*this);
30 }
31 */
32
33
34 Int64 Int64::operator << (int n)
35 {
36   Int64 res=*this;
37   while (n--)
38   {
39     res.HighPart<<=1;
40     if (res.LowPart & 0x80000000)
41       res.HighPart|=1;
42     res.LowPart<<=1;
43   }
44   return(res);
45 }
46
47
48 Int64 Int64::operator >> (int n)
49 {
50   Int64 res=*this;
51   while (n--)
52   {
53     res.LowPart>>=1;
54     if (res.HighPart & 1)
55       res.LowPart|=0x80000000;
56     res.HighPart>>=1;
57   }
58   return(res);
59 }
60
61
62 Int64 operator / (Int64 n1,Int64 n2)
63 {
64   if (n1.HighPart==0 && n2.HighPart==0)
65     return(Int64(0,n1.LowPart/n2.LowPart));
66   int ShiftCount=0;
67   while (n1>n2)
68   {
69     n2=n2<<1;
70     if (++ShiftCount>64)
71       return(0);
72   }
73   Int64 res=0;
74   while (ShiftCount-- >= 0)
75   {
76     res=res<<1;
77     if (n1>=n2)
78     {
79       n1-=n2;
80       ++res;
81     }
82     n2=n2>>1;
83   }
84   return(res);
85 }
86
87
88 Int64 operator * (Int64 n1,Int64 n2)
89 {
90   if (n1<0x10000 && n2<0x10000)
91     return(Int64(0,n1.LowPart*n2.LowPart));
92   Int64 res=0;
93   for (int I=0;I<64;I++)
94   {
95     if (n2.LowPart & 1)
96       res+=n1;
97     n1=n1<<1;
98     n2=n2>>1;
99   }
100   return(res);
101 }
102
103
104 Int64 operator % (Int64 n1,Int64 n2)
105 {
106   if (n1.HighPart==0 && n2.HighPart==0)
107     return(Int64(0,n1.LowPart%n2.LowPart));
108   return(n1-n1/n2*n2);
109 }
110
111
112 Int64 operator + (Int64 n1,Int64 n2)
113 {
114   n1.LowPart+=n2.LowPart;
115   if (n1.LowPart<n2.LowPart)
116     n1.HighPart++;
117   n1.HighPart+=n2.HighPart;
118   return(n1);
119 }
120
121
122 Int64 operator - (Int64 n1,Int64 n2)
123 {
124   if (n1.LowPart<n2.LowPart)
125     n1.HighPart--;
126   n1.LowPart-=n2.LowPart;
127   n1.HighPart-=n2.HighPart;
128   return(n1);
129 }
130
131
132 Int64 operator += (Int64 &n1,Int64 n2)
133 {
134   n1=n1+n2;
135   return(n1);
136 }
137
138
139 Int64 operator -= (Int64 &n1,Int64 n2)
140 {
141   n1=n1-n2;
142   return(n1);
143 }
144
145
146 Int64 operator *= (Int64 &n1,Int64 n2)
147 {
148   n1=n1*n2;
149   return(n1);
150 }
151
152
153 Int64 operator /= (Int64 &n1,Int64 n2)
154 {
155   n1=n1/n2;
156   return(n1);
157 }
158
159
160 Int64 operator | (Int64 n1,Int64 n2)
161 {
162   n1.LowPart|=n2.LowPart;
163   n1.HighPart|=n2.HighPart;
164   return(n1);
165 }
166
167
168 Int64 operator & (Int64 n1,Int64 n2)
169 {
170   n1.LowPart&=n2.LowPart;
171   n1.HighPart&=n2.HighPart;
172   return(n1);
173 }
174
175
176 /*
177 inline void operator -= (Int64 &n1,unsigned int n2)
178 {
179   if (n1.LowPart<n2)
180     n1.HighPart--;
181   n1.LowPart-=n2;
182 }
183
184
185 inline void operator ++ (Int64 &n)
186 {
187   if (++n.LowPart == 0)
188     ++n.HighPart;
189 }
190
191
192 inline void operator -- (Int64 &n)
193 {
194   if (n.LowPart-- == 0)
195     n.HighPart--;
196 }
197 */
198
199 bool operator == (Int64 n1,Int64 n2)
200 {
201   return(n1.LowPart==n2.LowPart && n1.HighPart==n2.HighPart);
202 }
203
204
205 bool operator > (Int64 n1,Int64 n2)
206 {
207   return((int)n1.HighPart>(int)n2.HighPart || n1.HighPart==n2.HighPart && n1.LowPart>n2.LowPart);
208 }
209
210
211 bool operator < (Int64 n1,Int64 n2)
212 {
213   return((int)n1.HighPart<(int)n2.HighPart || n1.HighPart==n2.HighPart && n1.LowPart<n2.LowPart);
214 }
215
216
217 bool operator != (Int64 n1,Int64 n2)
218 {
219   return(n1.LowPart!=n2.LowPart || n1.HighPart!=n2.HighPart);
220 }
221
222
223 bool operator >= (Int64 n1,Int64 n2)
224 {
225   return(n1>n2 || n1==n2);
226 }
227
228
229 bool operator <= (Int64 n1,Int64 n2)
230 {
231   return(n1<n2 || n1==n2);
232 }
233
234
235 void Int64::Set(uint HighPart,uint LowPart)
236 {
237   Int64::HighPart=HighPart;
238   Int64::LowPart=LowPart;
239 }
240 #endif
241
242 void itoa(Int64 n,char *Str)
243 {
244   if (n<=0xffffffff)
245   {
246     sprintf(Str,"%u",int64to32(n));
247     return;
248   }
249
250   char NumStr[50];
251   int Pos=0;
252
253   do
254   {
255     NumStr[Pos++]=int64to32(n%10)+'0';
256     n=n/10;
257   } while (n!=0);
258
259   for (int I=0;I<Pos;I++)
260     Str[I]=NumStr[Pos-I-1];
261   Str[Pos]=0;
262 }
263
264
265 Int64 atoil(char *Str)
266 {
267   Int64 n=0;
268   while (*Str>='0' && *Str<='9')
269   {
270     n=n*10+*Str-'0';
271     Str++;
272   }
273   return(n);
274 }