Mumpster
http://mumpster.org/

M code: Calc network & broadcast addr's from IP/netmask
http://mumpster.org/viewtopic.php?f=16&t=1646
Page 1 of 1

Author:  jollis [ Thu Sep 15, 2011 11:42 am ]
Post subject:  M code: Calc network & broadcast addr's from IP/netmask

binary.m:

Code:
binary

toBinary(decimalNum)
 n i,quot,rem,last,cnt,bstr s quot="1",last=decimalNum,bstr=""
 f i=1:1 s quot=last\2,rem(i)=last#2,last=quot q:quot=0
 s cnt=i
 f i=cnt:-1:1 s bstr=bstr_rem(i)
 q bstr

toGTMBinary(binaryString)
 q $c(0)_binaryString

toDecimal(binaryString)
 n i,lastMul,len,char s lastMul=0
 f i=1:1:$l(binaryString) d
 . s char=$e(binaryString,i,i)
 . s lastMul=lastMul*2+char
 q lastMul

;
; hack to work around strange behavior of $ZBITNOT()
;
not(str)
 n i,chr,nstr s nstr=""
 s str=$p(str,$c(0),2)
 f i=1:1:$l(str) d
 . s chr=$e(str,i,i)
 . i chr="0" s nstr=nstr_"1"
 . i chr="1" s nstr=nstr_"0"
 q $c(0)_nstr


IP.m:

Code:
IP

toDecimal(addr)
 n mul,tgt,i,dv s i="",dv=0
 s mul(1)=256**3,mul(2)=256**2,mul(3)=256**1,mul(4)=256**0
 f i=1:1:4 d
 . s tgt(i)=$p(addr,".",i)
 . s dv=dv+(tgt(i)*mul(i))
 q dv

toString(decAddr)
 n mul,i,quotient,last,tgt,out
 s i="",quotient=0,last=decAddr,out=""
 s mul(1)=256**3,mul(2)=256**2,mul(3)=256**1,mul(4)=256**0
 f i=1:1:4 d
 . s quotient=last\mul(i)
 . s last=last#mul(i)
 . s tgt(i)=quotient
 f i=1:1:4 d
 . s out=out_tgt(i)_"."
 q $e(out,1,$l(out)-1)

broadcast(addr,netmask)
 n ipdec,maskdec,bcastdec,maskb,addrb,binbc
 s ipdec=$$toDecimal(addr)
 s maskdec=$$toDecimal(netmask)
 s addrb=$$toBinary^binary(ipdec),maskb=$$toBinary^binary(maskdec)
 s addrb=$$toGTMBinary^binary(addrb),maskb=$$toGTMBinary^binary(maskb)
 s invmask=$$not^binary(maskb)
 s binbc=$zbitor(addrb,invmask)
 s binbc=$p(binbc,$c(0),2)
 q $$toString($$toDecimal^binary(binbc))

network(addr,netmask)
 n ipdec,maskdec,bcastdec,maskb,addrb,binnet,invmask
 s ipdec=$$toDecimal(addr)
 s maskdec=$$toDecimal(netmask)
 s addrb=$$toBinary^binary(ipdec),maskb=$$toBinary^binary(maskdec)
 s addrb=$$toGTMBinary^binary(addrb),maskb=$$toGTMBinary^binary(maskb)
 s binnet=$zbitand(addrb,maskb)
 s binnet=$p(binnet,$c(0),2)
 q $$toString($$toDecimal^binary(binnet))


call $$broadcast^IP(IP_address,subnet_mask) to get the broadcast address.
call $$network^IP(IP_address,subnet_mask) to get the network address.

Page 1 of 1 All times are UTC - 8 hours [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/