; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3588&start=10
; Author: Topsoft (updated for PB 4.00 by Andre)
; Date: 02. January 2004
; OS: Windows
; Demo: No
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