Dotted-Decimal Address system

Share your advanced PureBasic knowledge/code with the community.
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Dotted-Decimal Address system

Post by Guimauve »

Hello everyone,

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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Last edited by Guimauve on Wed Sep 26, 2012 3:41 pm, edited 1 time in total.
Dear Optimist, Pessimist,
and Realist,

While you guys were
busy arguing about the
glass of water, I DRANK IT !

Sincerely,
the Opportunist
User avatar
Tenaja
Addict
Addict
Posts: 1959
Joined: Tue Nov 09, 2010 10:15 pm

Re: Dotted-Decimal Address system

Post by Tenaja »

Thanks for sharing. I get an error:
UpdateAddress() is not a function, array, list, map or macro.
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Dotted-Decimal Address system

Post by Guimauve »

Tenaja wrote:Thanks for sharing. I get an error:
UpdateAddress() is not a function, array, list, map or macro.
It's corrected.

Thanks by the way !

Best regards
Guimauve
Dear Optimist, Pessimist,
and Realist,

While you guys were
busy arguing about the
glass of water, I DRANK IT !

Sincerely,
the Opportunist
Post Reply