; 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