Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '7zip/Compress/Rar29/Original/int64.cpp')
-rwxr-xr-x7zip/Compress/Rar29/Original/int64.cpp274
1 files changed, 274 insertions, 0 deletions
diff --git a/7zip/Compress/Rar29/Original/int64.cpp b/7zip/Compress/Rar29/Original/int64.cpp
new file mode 100755
index 00000000..996d0ea6
--- /dev/null
+++ b/7zip/Compress/Rar29/Original/int64.cpp
@@ -0,0 +1,274 @@
+#include "rar.hpp"
+
+#ifndef NATIVE_INT64
+
+Int64::Int64()
+{
+}
+
+
+Int64::Int64(uint n)
+{
+ HighPart=0;
+ LowPart=n;
+}
+
+
+Int64::Int64(uint HighPart,uint LowPart)
+{
+ Int64::HighPart=HighPart;
+ Int64::LowPart=LowPart;
+}
+
+
+/*
+Int64 Int64::operator = (Int64 n)
+{
+ HighPart=n.HighPart;
+ LowPart=n.LowPart;
+ return(*this);
+}
+*/
+
+
+Int64 Int64::operator << (int n)
+{
+ Int64 res=*this;
+ while (n--)
+ {
+ res.HighPart<<=1;
+ if (res.LowPart & 0x80000000)
+ res.HighPart|=1;
+ res.LowPart<<=1;
+ }
+ return(res);
+}
+
+
+Int64 Int64::operator >> (int n)
+{
+ Int64 res=*this;
+ while (n--)
+ {
+ res.LowPart>>=1;
+ if (res.HighPart & 1)
+ res.LowPart|=0x80000000;
+ res.HighPart>>=1;
+ }
+ return(res);
+}
+
+
+Int64 operator / (Int64 n1,Int64 n2)
+{
+ if (n1.HighPart==0 && n2.HighPart==0)
+ return(Int64(0,n1.LowPart/n2.LowPart));
+ int ShiftCount=0;
+ while (n1>n2)
+ {
+ n2=n2<<1;
+ if (++ShiftCount>64)
+ return(0);
+ }
+ Int64 res=0;
+ while (ShiftCount-- >= 0)
+ {
+ res=res<<1;
+ if (n1>=n2)
+ {
+ n1-=n2;
+ ++res;
+ }
+ n2=n2>>1;
+ }
+ return(res);
+}
+
+
+Int64 operator * (Int64 n1,Int64 n2)
+{
+ if (n1<0x10000 && n2<0x10000)
+ return(Int64(0,n1.LowPart*n2.LowPart));
+ Int64 res=0;
+ for (int I=0;I<64;I++)
+ {
+ if (n2.LowPart & 1)
+ res+=n1;
+ n1=n1<<1;
+ n2=n2>>1;
+ }
+ return(res);
+}
+
+
+Int64 operator % (Int64 n1,Int64 n2)
+{
+ if (n1.HighPart==0 && n2.HighPart==0)
+ return(Int64(0,n1.LowPart%n2.LowPart));
+ return(n1-n1/n2*n2);
+}
+
+
+Int64 operator + (Int64 n1,Int64 n2)
+{
+ n1.LowPart+=n2.LowPart;
+ if (n1.LowPart<n2.LowPart)
+ n1.HighPart++;
+ n1.HighPart+=n2.HighPart;
+ return(n1);
+}
+
+
+Int64 operator - (Int64 n1,Int64 n2)
+{
+ if (n1.LowPart<n2.LowPart)
+ n1.HighPart--;
+ n1.LowPart-=n2.LowPart;
+ n1.HighPart-=n2.HighPart;
+ return(n1);
+}
+
+
+Int64 operator += (Int64 &n1,Int64 n2)
+{
+ n1=n1+n2;
+ return(n1);
+}
+
+
+Int64 operator -= (Int64 &n1,Int64 n2)
+{
+ n1=n1-n2;
+ return(n1);
+}
+
+
+Int64 operator *= (Int64 &n1,Int64 n2)
+{
+ n1=n1*n2;
+ return(n1);
+}
+
+
+Int64 operator /= (Int64 &n1,Int64 n2)
+{
+ n1=n1/n2;
+ return(n1);
+}
+
+
+Int64 operator | (Int64 n1,Int64 n2)
+{
+ n1.LowPart|=n2.LowPart;
+ n1.HighPart|=n2.HighPart;
+ return(n1);
+}
+
+
+Int64 operator & (Int64 n1,Int64 n2)
+{
+ n1.LowPart&=n2.LowPart;
+ n1.HighPart&=n2.HighPart;
+ return(n1);
+}
+
+
+/*
+inline void operator -= (Int64 &n1,unsigned int n2)
+{
+ if (n1.LowPart<n2)
+ n1.HighPart--;
+ n1.LowPart-=n2;
+}
+
+
+inline void operator ++ (Int64 &n)
+{
+ if (++n.LowPart == 0)
+ ++n.HighPart;
+}
+
+
+inline void operator -- (Int64 &n)
+{
+ if (n.LowPart-- == 0)
+ n.HighPart--;
+}
+*/
+
+bool operator == (Int64 n1,Int64 n2)
+{
+ return(n1.LowPart==n2.LowPart && n1.HighPart==n2.HighPart);
+}
+
+
+bool operator > (Int64 n1,Int64 n2)
+{
+ return((int)n1.HighPart>(int)n2.HighPart || n1.HighPart==n2.HighPart && n1.LowPart>n2.LowPart);
+}
+
+
+bool operator < (Int64 n1,Int64 n2)
+{
+ return((int)n1.HighPart<(int)n2.HighPart || n1.HighPart==n2.HighPart && n1.LowPart<n2.LowPart);
+}
+
+
+bool operator != (Int64 n1,Int64 n2)
+{
+ return(n1.LowPart!=n2.LowPart || n1.HighPart!=n2.HighPart);
+}
+
+
+bool operator >= (Int64 n1,Int64 n2)
+{
+ return(n1>n2 || n1==n2);
+}
+
+
+bool operator <= (Int64 n1,Int64 n2)
+{
+ return(n1<n2 || n1==n2);
+}
+
+
+void Int64::Set(uint HighPart,uint LowPart)
+{
+ Int64::HighPart=HighPart;
+ Int64::LowPart=LowPart;
+}
+#endif
+
+void itoa(Int64 n,char *Str)
+{
+ if (n<=0xffffffff)
+ {
+ sprintf(Str,"%u",int64to32(n));
+ return;
+ }
+
+ char NumStr[50];
+ int Pos=0;
+
+ do
+ {
+ NumStr[Pos++]=int64to32(n%10)+'0';
+ n=n/10;
+ } while (n!=0);
+
+ for (int I=0;I<Pos;I++)
+ Str[I]=NumStr[Pos-I-1];
+ Str[Pos]=0;
+}
+
+
+Int64 atoil(char *Str)
+{
+ Int64 n=0;
+ while (*Str>='0' && *Str<='9')
+ {
+ n=n*10+*Str-'0';
+ Str++;
+ }
+ return(n);
+}