Nothing special, not tips or tricks, etc, just a bit of gibberish to get me maybe going again.
If it is useful to anybody, that’s great, else "oh well"
(Also, I am still on an older version of PB at the moment as I have just not gotten around to updating.)
Code: Select all
#Title="Subnet Calculator"
Enumeration
#window_0
#ip_address_host
#ip_netmask
#String_bin_host
#string_bin_netmask
#string_network_number
#string_bin_network_number
#string_broadcast_address
#string_bin_broadcast_address
#String_cidr
#string_otherinfo
#Button1
EndEnumeration
host.q
netmask.q
networkaddress.q
broadcast.q
cidr.l
Procedure CheckCharactersValid(Text$,gadget)
For a=1 To Len(text$)
ch$=Mid(text$,a,1)
ch=Asc(ch$)
If ch<46 Or ch>57 Or ch=47
msg.s="Invalid character in "
Select gadget
Case #ip_address_host
msg$=msg+"Host Ip Address"
Case #ip_netmask
msg$=msg+"Netmask Address"
EndSelect
MessageRequester("Error",msg$)
ProcedureReturn 0
EndIf
Next
ProcedureReturn 1
EndProcedure
Procedure CheckDDNValid(Text$,gadget)
dots=CountString(Text$,".")
If dots <>3
msg.s="Inavlid dotted Decimal Notation - "
Select gadget
Case #ip_address_host
msg$=msg+"Host IP Address"
Case #ip_netmask
msg$=msg+"Netmask Address"
EndSelect
MessageRequester("Error",msg$)
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
Procedure CheckValidNetmask(mask.q)
If FindString(Bin(mask),"01")
MessageRequester("error", "Invalid netmask used")
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
Procedure.q ParseAddress(Text$,gadget.l)
If Not CheckCharactersValid(Text$,gadget) Or Not CheckDDNValid(Text$,gadget)
ProcedureReturn 0
EndIf
qty=CountString(Text$,".")
For a=1 To qty+1
If Val(StringField(Text$,a,"."))>255
msg.s= " octet "+Str(a)+" - "+StringField(Text$,a,".")+" - Invalid value"
Select gadget
Case #ip_netmask
msg$="inavlid netmask @"+msg
Case #ip_address_host
msg$="invalid host address @"+msg
EndSelect
MessageRequester("Error",msg$)
ProcedureReturn 0
EndIf
ntext$+RSet(Bin(Val(StringField(Text$,a,"."))),8,"0")
Next
ProcedureReturn Val("%"+ntext$)
EndProcedure
Procedure.q BitwiseAnd(bwaddress.q,bwnetmask.q)
ProcedureReturn bwaddress & bwnetmask
EndProcedure
Procedure.s NetworkAddressString(naaddress.q)
b=3 : address$=""
While b>-1
ips=IPAddressField(naaddress,b)
address$+Str(ips)
If b
address$+"."
EndIf
b-1
Wend
ProcedureReturn address$
EndProcedure
Procedure.q BroadcastAddress(netaddress.q,mask.q)
mask$=RSet(Bin(mask),32,"0")
hostlength=CountString(mask$,"0")
netlength=CountString(mask$,"1")
t$=LSet(t$,hostlength,"1")
netadd$=RSet(Bin(netaddress),32,"0")
net2$=RemoveString(netadd$,"0",#PB_String_NoCase,netlength); seems to be a little bug in removestring??
If Len(net2$)<netlength ;workaround seems to be a bug in removestring??
net2$+"0"
EndIf ; comment this section out to see bug in action...
net2$+t$
ProcedureReturn Val("%"+net2$)
EndProcedure
Procedure Counthosts(broadcastaddress.q,networkaddress.q)
ProcedureReturn broadcastaddress-(networkaddress+1)
EndProcedure
Procedure Countsubnets(acidr)
a=acidr%8
ProcedureReturn Pow(2,a)
EndProcedure
Procedure DisplayInfo(netaddress.q,hostaddress.q,netbits.q,maskaddress.q,broadcastaddress.q,errorlevel.l,hosts.l,subnets.l)
If Not errorlevel
SetGadgetText(#String_bin_host,RSet(Bin(hostaddress),32,"0"))
SetGadgetText(#String_bin_netmask,RSet(Bin(maskaddress),32,"0"))
SetGadgetText(#String_cidr,"/"+Str(netbits))
SetGadgetText(#String_network_number,NetworkAddressString(netaddress))
SetGadgetText(#string_bin_network_number,RSet(Bin(netaddress),32,"0"))
SetGadgetText(#String_broadcast_address,NetworkAddressString(broadcastaddress))
SetGadgetText(#string_bin_broadcast_address,RSet(Bin(broadcastaddress),32,"0"))
SetGadgetText(#string_otherinfo,"Useable hosts per Sub/Network = "+Str(hosts)+", Possible Sub/Networks = "+Str(subnets))
tip$="Network Address = "+GetGadgetText(#string_network_number)
tip$+" | Useable Hosts = "+Str(hosts)
tip$+" | Sub/Networks = "+Str(subnets)
GadgetToolTip(#string_otherinfo,tip$)
Else
msg.s="invalid, please check your addressing"
SetGadgetText(#String_bin_host,"")
SetGadgetText(#String_bin_netmask,"")
SetGadgetText(#String_cidr,"")
SetGadgetText(#String_network_number,"")
SetGadgetText(#string_bin_network_number,"")
SetGadgetText(#String_broadcast_address,"")
SetGadgetText(#string_bin_broadcast_address,"")
SetGadgetText(#string_otherinfo,msg)
EndIf
EndProcedure
Procedure win1()
result=OpenWindow(#window_0,0,0,550,275,#Title,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If result
Delay(50)
StringGadget(#ip_address_host,15,25,120,30,"192.168.3.55")
GadgetToolTip(#ip_address_host,"Host IP Address")
TextGadget(#String_bin_host,140,25,260,30,"",#PB_Text_Border)
StringGadget(#ip_netmask,15,60,120,30,"255.255.255.0")
GadgetToolTip(#ip_netmask,"Netmask (Valid octets - 0,128,192,224,240,248,252,254,255)")
TextGadget(#String_bin_netmask,140,60,260,30,"",#PB_Text_Border)
TextGadget(#String_cidr,410,60,50,30,"",#PB_Text_Border)
GadgetToolTip(#String_cidr,"Classless InterDomain Routing number")
StringGadget(#string_network_number,15,100,120,30,"")
GadgetToolTip(#string_network_number,"Network Address")
StringGadget(#string_broadcast_address,15,140,120,30,"")
GadgetToolTip(#string_broadcast_address,"Broadcast Address")
TextGadget(#string_bin_network_number,140,100,260,30,"",#PB_Text_Border)
TextGadget(#string_bin_broadcast_address,140,140,260,30,"",#PB_Text_Border)
StringGadget(#string_otherinfo,15,180,500,30,"")
GadgetToolTip(#string_otherinfo,"Some geekish info...")
ButtonGadget(#Button1,230,220,100,40,"Calculate")
EndIf
ProcedureReturn result
EndProcedure
If Not win1()
MessageRequester("Fail","Window opening fault")
End
EndIf
Repeat
ev=WaitWindowEvent(1)
Select ev
Case #PB_Event_Gadget
Select EventGadget()
Case #Button1
Host=Parseaddress(GetGadgetText(#ip_address_host),#ip_address_host)
netmask=ParseAddress(GetGadgetText(#ip_netmask),#ip_netmask)
maskvalid=CheckValidNetmask(netmask)
cidr=CountString(Bin(netmask),"1")
networkaddress=BitwiseAnd(host,netmask)
broadcast=BroadcastAddress(networkaddress,netmask)
If maskvalid And host And netmask
errors=0
nbrhosts=Counthosts(broadcast,networkaddress)
nbrsubnets=CountSubnets(cidr)
Else
errors=1
EndIf
DisplayInfo(networkaddress,host,cidr,netmask,broadcast,errors,nbrhosts,nbrsubnets)
EndSelect
Case #PB_Event_CloseWindow
Quit=#True
EndSelect
Until quit