; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=2342&highlight=
; Author: GPI
; Date: 20. September 2003
; OS: Windows
; Demo: No
; Some functions for using 64 bit Longs with PureBasic, e.g. for handling the
; results of some WinAPI functions (example: free disk space)
; Values from 0 - 18,446,744,073,709,551,615 are possible
; Einige WinAPI-Funktionen liefern ja 64-Bit-Zahlen zurück (bsw.: Freier Festplattenplatz,
; auch die Dateigröße bei NTSC-System kann so groß werden!), so daß ich hier ein paar
; Funktionen geschrieben hab, die mit Longs umgehen können.
; Damit sind Zahlen von 0 - 18.446.744.073.709.551.615 möglich.
Structure LongLongs
lowlow.w
lowhi.w
LongLongs.w
hihi.w
EndStructure
Structure LongLongs2
low.l
hi.l
EndStructure
Procedure.s LL_Hex(*Value1.LongLongs); hex(value1)
a$=RSet(Hex(*Value1\hihi&$ffff),4,"0")+RSet(Hex(*Value1\LongLongs&$ffff),4,"0")+RSet(Hex(*Value1\lowhi&$ffff),4,"0")+RSet(Hex(*Value1\lowlow&$ffff),4,"0")
While Left(a$,1)="0"
a$=Mid(a$,2,Len(a$)-1)
Wend
If a$
ProcedureReturn a$
Else
ProcedureReturn "0"
EndIf
EndProcedure
Procedure.s LL_Bin(*Value1.LongLongs); bin(value1)
a$=RSet(Bin(*Value1\hihi&$ffff),16,"0")+RSet(Bin(*Value1\LongLongs&$ffff),16,"0")+RSet(Bin(*Value1\lowhi&$ffff),16,"0")+RSet(Bin(*Value1\lowlow&$ffff),16,"0")
While Left(a$,1)="0"
a$=Mid(a$,2,Len(a$)-1)
Wend
If a$
ProcedureReturn a$
Else
ProcedureReturn "0"
EndIf
EndProcedure
Procedure LL_ShiftRight(*Value1.LongLongs,divx) ; Value1=Value1>>divx
LongLongs=*Value1\LongLongs&$ffff
hihi=*Value1\hihi&$ffff
lowlow=*Value1\lowlow&$ffff
lowhi=*Value1\lowhi&$ffff
While divx>0
If divx>16: divx-16:div=16 : Else : div=divx:divx=0 : EndIf
mask=(1<
>div)+((lowhi&mask)<>div)+((LongLongs&mask)<>div)+((hihi&mask)<>div)
Wend
*Value1\LongLongs=LongLongs
*Value1\lowlow=lowlow
*Value1\hihi=hihi
*Value1\lowhi=lowhi
ProcedureReturn *Value1
EndProcedure
Procedure LL_ShiftLeft(*Value1.LongLongs,mulx) ; Value1=Value1<0
If mul>16: mulx-16:mul=16 : Else : mul=mulx:mulx=0 : EndIf
lowlow=(lowlow<>16&$ffff) :lowlow&$ffff
LongLongs =(LongLongs <>16&$ffff) :lowhi&$ffff
hihi =((hihi <>16&$ffff))&$ffff :LongLongs&$ffff
Wend
*Value1\LongLongs=LongLongs
*Value1\lowlow=lowlow
*Value1\hihi=hihi
*Value1\lowhi=lowhi
ProcedureReturn *Value1
EndProcedure
Procedure LL_Add(*Value1.LongLongs,*Value2.LongLongs) ; Value1+Value2
LongLongs1=*Value1\LongLongs&$ffff
hihi1=*Value1\hihi&$ffff
lowlow1=*Value1\lowlow&$ffff
lowhi1=*Value1\lowhi&$ffff
LongLongs2=*Value2\LongLongs&$ffff
hihi2=*Value2\hihi&$ffff
lowlow2=*Value2\lowlow&$ffff
lowhi2=*Value2\lowhi&$ffff
lowlow=lowlow1+lowlow2
lowhi=(lowhi1+lowhi2)+((lowlow>>16)&$ffff):lowlow&$FFFF
LongLongs=(LongLongs1+LongLongs2)+((lowhi>>16)&$FFFF):lowhi&$ffff
hihi=((hihi1+hihi2)+((LongLongs>>16)&$FFFF))&$FFFF:LongLongs&$FFFF
*Value1\LongLongs=LongLongs
*Value1\lowlow=lowlow
*Value1\hihi=hihi
*Value1\lowhi=lowhi
ProcedureReturn *Value1
EndProcedure
Procedure LL_Sub(*Value1.LongLongs,*Value2.LongLongs) ; Value1-Value2
LongLongs1=*Value1\LongLongs&$ffff
hihi1=*Value1\hihi&$ffff
lowlow1=*Value1\lowlow&$ffff
lowhi1=*Value1\lowhi&$ffff
LongLongs2=(~*Value2\LongLongs)&$ffff
hihi2=(~*Value2\hihi)&$ffff
lowlow2=(~*Value2\lowlow)&$ffff
lowhi2=(~*Value2\lowhi)&$ffff
lowlow=lowlow1+lowlow2+1
lowhi=(lowhi1+lowhi2)+((lowlow>>16)&$ffff):lowlow&$FFFF
LongLongs=(LongLongs1+LongLongs2)+((lowhi>>16)&$FFFF):lowhi&$ffff
hihi=((hihi1+hihi2)+((LongLongs>>16)&$FFFF))&$FFFF:LongLongs&$FFFF
*Value1\LongLongs=LongLongs
*Value1\lowlow=lowlow
*Value1\hihi=hihi
*Value1\lowhi=lowhi
ProcedureReturn *Value1
EndProcedure
Procedure LL_Bit(*Value1.LongLongs2,bit) ; Test if bit set
If bit>=32
x=1<<(bit-32)
ProcedureReturn (*Value1\hi&x)
Else
x=1<hihi2
Result=-1
ElseIf hihi1LongLongs2
Result=-1
ElseIf LongLongs1lowhi2
Result=-1
ElseIf lowhi1lowlow2
Result=-1
ElseIf lowlow1