Something I have worked on just before ts-soft release GUIDGen (windows and linux) making my code just good but not much better.
So I release it just in case it can be useful for someone.
See the "Programming notes" for detail about the address system.
Best regards.
Guimauve
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Address System
; File Name : Address System.pb
; File version: 1.0.0
; Programming : OK
; Programmed by : Guimauve
; Date : 26-09-2012
; Last Update : 26-09-2012
; PureBasic code : 4.70
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programming notes
;
; This address system work the same way as IPv4 Dotted-decimal
; notation address system work. But the only difference is the
; maximum value member of the address can reach.
;
; In the IPv4 Address system each member are ranging from 0 to
; 255 (255.255.255.255) giving 4 294 967 295 possible address.
;
; For this system each member can use an arbitrary ranging
; from 0 to any possible value smaller or equal to 65534.
;
; I will let you to do the math to count how many address are
; possible when each member ranging from 0 to 65534.
;
; Where this kind of address system can be used ?
;
; - To give an address to a Domotic module.
; - To give an identification to an entity in a 3D scene.
; (Maybe a little Find "Address" & Replace by "Identification"
; on the entire source code will be better.)
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<
Structure Address
A.u ; Special : Increment
B.u ; Special : Increment
C.u ; Special : Increment
D.u ; Special : Increment
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<
Macro GetAddressA(AddressA)
AddressA\A
EndMacro
Macro GetAddressB(AddressA)
AddressA\B
EndMacro
Macro GetAddressC(AddressA)
AddressA\C
EndMacro
Macro GetAddressD(AddressA)
AddressA\D
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<
Macro SetAddressA(AddressA, P_A)
GetAddressA(AddressA) = P_A
EndMacro
Macro SetAddressB(AddressA, P_B)
GetAddressB(AddressA) = P_B
EndMacro
Macro SetAddressC(AddressA, P_C)
GetAddressC(AddressA) = P_C
EndMacro
Macro SetAddressD(AddressA, P_D)
GetAddressD(AddressA) = P_D
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The specials operators <<<<<
Macro IncrementAddressA(AddressA, P_Increment = 1)
SetAddressA(AddressA, GetAddressA(AddressA) + P_Increment)
EndMacro
Macro IncrementAddressB(AddressA, P_Increment = 1)
SetAddressB(AddressA, GetAddressB(AddressA) + P_Increment)
EndMacro
Macro IncrementAddressC(AddressA, P_Increment = 1)
SetAddressC(AddressA, GetAddressC(AddressA) + P_Increment)
EndMacro
Macro IncrementAddressD(AddressA, P_Increment = 1)
SetAddressD(AddressA, GetAddressD(AddressA) + P_Increment)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Update operator <<<<<
Macro UpdateAddress(AddressA, P_A, P_B, P_C, P_D)
SetAddressA(AddressA, P_A)
SetAddressB(AddressA, P_B)
SetAddressC(AddressA, P_C)
SetAddressD(AddressA, P_D)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Reset operator <<<<<
Macro ResetAddress(AddressA)
ClearStructure(AddressA, Address)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Copy operator : A = Source : B = Destination <<<<<
Macro CopyAddress(AddressA, AddressB)
CopyMemory(AddressA, AddressB, SizeOf(Address))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Compare operator <<<<<
Macro CompareAddress(AddressA, AddressB)
CompareMemory(AddressA, AddressB, SizeOf(Address))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Swap operator <<<<<
Macro SwapAddress(AddressA, AddressB)
Swap GetAddressA(AddressA), GetAddressA(AddressB)
Swap GetAddressB(AddressA), GetAddressB(AddressB)
Swap GetAddressC(AddressA), GetAddressC(AddressB)
Swap GetAddressD(AddressA), GetAddressD(AddressB)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Read in Binary file <<<<<
Macro ReadAddress(FileID, AddressA)
ReadData(FileID, AddressA, SizeOf(Address))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Write in Binary file <<<<<
Macro WriteAddress(FileID, AddressA)
WriteData(FileID, AddressA, SizeOf(Address))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Formating Operator <<<<<
Macro FormatAddress(AddressA)
Str(GetAddressA(AddressA)) + "." + Str(GetAddressB(AddressA)) + "." + Str(GetAddressC(AddressA)) + "." + Str(GetAddressD(AddressA))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Unformating Operator <<<<<
Macro UnformatAddress(AddressA, P_FormatedAddress)
SetAddressA(AddressA, Val(StringField(P_FormatedAddress, 1, ".")))
SetAddressB(AddressA, Val(StringField(P_FormatedAddress, 2, ".")))
SetAddressC(AddressA, Val(StringField(P_FormatedAddress, 3, ".")))
SetAddressD(AddressA, Val(StringField(P_FormatedAddress, 4, ".")))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Read preferences group <<<<<
Procedure ReadPreferenceAddress(GroupName.s, *AddressA.Address)
Protected FormattedAddress.s = ReadPreferenceString(GroupName, FormatAddress(*AddressA))
UnformatAddress(*AddressA, FormattedAddress)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Write preferences group <<<<<
Procedure WritePreferenceAddress(GroupName.s, *AddressA.Address)
WritePreferenceString(GroupName, FormatAddress(*AddressA))
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Increment operator <<<<<
Procedure IncrementAddress(*AddressA.Address, ABCD_Max.u = 100)
IncrementAddressD(*AddressA)
If GetAddressD(*AddressA) > ABCD_Max
SetAddressD(*AddressA, 0)
IncrementAddressC(*AddressA)
EndIf
If GetAddressC(*AddressA) > ABCD_Max
SetAddressC(*AddressA, 0)
IncrementAddressB(*AddressA)
EndIf
If GetAddressB(*AddressA) > ABCD_Max
SetAddressB(*AddressA, 0)
IncrementAddressA(*AddressA)
EndIf
If GetAddressA(*AddressA) > ABCD_Max
UpdateAddress(*AddressA, ABCD_Max, ABCD_Max, ABCD_Max, ABCD_Max)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<<
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<<
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
For Index = 0 To 10000
If IncrementAddress(MyAddress.Address, 9) <> 1
Debug FormatAddress(MyAddress)
Else
Debug "No more Address available ! " + Str(Index)
Debug FormatAddress(MyAddress)
Debug ""
Break
EndIf
Next
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<