\ ipsubnet.4th
\ Calculate Subnet for IP Address and Mask
\ Copyright (c) 1999 Marty McGowan
\ Provided under the terms of the GNU General Public License
\ Required source files:
\ none
\ Revisions:
\ 1999-12-30 created MJM
\ 2007-10-27 ported to 4tH JLB
\ 2008-01-09 lib change JLB
\ this program computes the full IP Subnet, given an IP address
\ and the subnet mask expressed as either a dotted quad, or the
\ now more popular /#bits form.
\ i wrote it in response to a 468 K-byte (!!) Windows program
\ which does the same thing.
\ user instructions are below, and printed once gratuitously or
\ at user request: .help
\ -- Marty McGowan
\ mcgowan@alum.mit.edu - home
\ mcfly@workmail.com - work
[needs lib/interprt.4th]
: dashes
." ===================================================" cr
;
: separator cr dashes cr ;
: .HELP cr
." Usage Examples (enter addresses without dots)"
separator
." 10 4 1 2 DOTTED.QUAD IP-ADDR " cr
." 255 255 192 0 DOTTED.QUAD MASK" cr
." or:" cr
." 18 #BITS MASK" cr
." and then:" cr
." SUBNET?" cr
." prints your answer " cr
." After both IP-ADDR and MASK are set," cr
." either may be changed for a new SUBNET? query." cr
." to repeat this message: .HELP"
separator
;
: riteByte dup 255 and swap 8 rshift ;
: print.quad riteByte riteByte riteByte riteByte drop . . . . ;
: dotted.quad >r >r >r 256 * r> + 256 * r> + 256 * r> + ;
: #bits negate 32 + 1 swap lshift 1- invert ;
variable _ip 1 constant _ipset
variable _mask 2 constant _maskset
variable _set 1 2 [+] constant MUSTSET
: toset _set @ or _set ! ;
: isset? _set @ MUSTSET = ;
: ip-addr _ip ! _ipset toset ;
: mask _mask ! _maskset toset ;
: subnet? isset? if _ip @ _mask @
dup ." MASK: " print.quad cr
2dup and 1+ ." GATEWAY: " print.quad cr
invert dup 1+ ." NET SIZE: " . cr
or ." UPPER: " print.quad cr
else separator ." Please follow instructions:" cr .help
then
;
\ -------------
\ 4tH interface
\ -------------
: bye quit ;
create wordlist
," print.quad" ' print.quad ,
," dotted.quad" ' dotted.quad ,
," #bits" ' #bits ,
," ip-addr" ' ip-addr ,
," mask" ' mask ,
," subnet?" ' subnet? ,
," .help" ' .help ,
," bye" ' bye ,
," exit" ' bye ,
null ,
wordlist to dictionary
:noname ." Unknown command '" type ." '" cr ; is NotFound
: ipsubnet
.help
begin
." OK" cr
refill drop ['] interpret
catch if ." Error" cr then
again
;
ipsubnet
|