OK I took some time today to really go through this IPCalc function. Note to self: Don’t try to write publicly distributable code quickly.
That being said, I’ve been asked to include this function in the library of commands and functions everyone’s been talking about. So I am going to post the code here, and anyone wanting a shot at breaking it (as if you could) give it a go. NOTE: There is no error checking as of yet so you *could* break it by passing an invalid value like 256.256.256.0 for a subnet address. Meanwhile I am going to write some pretty thorough error checking before I submit it for public consumption, so that there are no values you can pass to it that would break it or otherwise return bad values. function IPCalc theIPAddress, theSubnetMask -- pass either CIDR notation in theIPAddress or else a standard IP and subnet mask -- returns an array of the following values: -- bcastaddr -- cidraddr -- cidrdepth -- firstaddr -- ipaddress -- lastaddr -- subnetaddr -- subnetmask -- usablecountset the itemdelimiter to "." set the itemdelimiter to "." -- initial setup set the numberFormat to "00000000" -- detemine format if theIPAddress contains "/" then put offset("/", theIPAddress) into theCIDRDelim put char theCIDRDelim +1 to -1 of theIPAddress into theCIDRDepth put charx("1", theCIDRDepth) & charx("0", 32-theCIDRDepth) into theBinSubnetMask put baseconvert(char 1 to 8 of theBinSubnetMask, 2, 10) into item 1 of theSubnetMask put baseconvert(char 9 to 16 of theBinSubnetMask, 2, 10) into item 2 of theSubnetMask put baseconvert(char 17 to 24 of theBinSubnetMask, 2, 10) into item 3 of theSubnetMask put baseconvert(char 25 to 32 of theBinSubnetMask, 2, 10) into item 4 of theSubnetMask put char 1 to theCIDRDelim -1 of theIPAddress into theIPAddress else -- convert the subnet mask to binary put 0 into whichOctet repeat for each item theOctet in theSubnetMask add 1 to whichOctet put value(baseConvert(theOctet, 10, 2)) after theBinSubnetMask end repeat put offset("0", theBinSubnetMask) -1 into theCIDRDepth end if -- convert the ip address to binary put 0 into whichOctet repeat for each item theOctet in theIPAddress add 1 to whichOctet put baseConvert(theOctet, 10, 2) into theBinValue add 0 to theBinValue put theBinValue after theBinIPAddress end repeat -- calculate the binary subnet address put char 1 to theCIDRDepth of theBinIPAddress into theBinNetworkAddr put char theCIDRDepth +1 to -1 of theBinIPAddress into theBinNodeAddr put theBinNodeAddr into theBinSubnetNodeAddr set the numberFormat to "0" replace "1" with "0" in theBinSubnetNodeAddr put theBinNetworkAddr & theBinSubnetNodeAddr into theBinSubnetAddr -- convert the binary subnet address to decimal put baseconvert(char 1 to 8 of theBinSubnetAddr, 2, 10) into item 1 of theSubnetAddr put baseconvert(char 9 to 16 of theBinSubnetAddr, 2, 10) into item 2 of theSubnetAddr put baseconvert(char 17 to 24 of theBinSubnetAddr, 2, 10) into item 3 of theSubnetAddr put baseconvert(char 25 to 32 of theBinSubnetAddr, 2, 10) into item 4 of theSubnetAddr -- calculate the first usable IP address put theSubnetAddr into theFirstAddr add 1 to item 4 of theFirstAddr -- calculate the binary broadcast address put theBinNodeAddr into theBinBcastNodeAddr replace "0" with "1" in theBinBcastNodeAddr put theBinNetworkAddr & theBinBcastNodeAddr into theBinBcastAddr -- convert the binary broadcast address to decimal put baseconvert(char 1 to 8 of theBinBcastAddr, 2, 10) into item 1 of theBcastAddr put baseconvert(char 9 to 16 of theBinBcastAddr, 2, 10) into item 2 of theBcastAddr put baseconvert(char 17 to 24 of theBinBcastAddr, 2, 10) into item 3 of theBcastAddr put baseconvert(char 25 to 32 of theBinBcastAddr, 2, 10) into item 4 of theBcastAddr -- calculate the last usable IP address put theBcastAddr into theLastAddr subtract 1 from item 4 of theLastAddr -- calculate the number of usable addresses -- put item 4 of theLastAddr - item 4 of theFirstAddr +1 into theAddrCount put baseconvert(theBinBcastNodeAddr, 2, 10) -1 into theAddrCount -- calculate the CIDR notation put theSubnetAddr & "/" & theCIDRDepth into theCIDRAddr -- create array put theIPAddress into ipdata ["ipaddress"] put theSubnetMask into ipdata ["subnetmask"] put theSubnetAddr into ipdata ["subnetaddr"] put theFirstAddr into ipdata ["firstaddr"] put theBcastAddr into ipdata["bcastaddr"] put theLastAddr into ipdata ["lastaddr"] put theCIDRDepth into ipdata ["cidrdepth"] put theAddrCount into ipdata ["usablecount"] put theCIDRAddr into ipdata ["cidraddr"] return ipdata end IPCalc _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode