Canonicalize CIDR: Difference between revisions
Content added Content deleted
(→{{header|SNOBOL}}: Add implementation) |
(→{{header|Commodore BASIC}}: Add implementation.) |
||
Line 462: | Line 462: | ||
184.232.176.184/18 => 184.232.128.0/18</pre> |
184.232.176.184/18 => 184.232.128.0/18</pre> |
||
=={{header|Commodore BASIC}}== |
|||
<lang gwbasic>100 REM THE BINARY OPS ONLY WORK ON SIGNED 16-BIT NUMBERS |
|||
110 REM SO WE STORE THE IP ADDRESS AS AN ARRAY OF FOUR OCTETS |
|||
120 DIM IP(3) |
|||
130 REM READ DEMO DATA |
|||
140 READ CI$ |
|||
150 IF CI$="" THEN END |
|||
160 REM FIND / |
|||
170 SL=0 |
|||
180 FOR I=LEN(CI$) TO 1 STEP -1 |
|||
190 : IF MID$(CI$,I,1)="/" THEN SL=I:I=1 |
|||
200 NEXT I |
|||
210 IF SL=0 THEN PRINT "INVALID CIDR STRING: '"CI$"'":GOTO 140 |
|||
220 NW=VAL(MID$(CI$,SL+1)) |
|||
230 IF NW < 1 OR NW > 32 THEN PRINT "INVALID NETWORK WIDTH:"NW:GOTO 140 |
|||
240 REM PARSE OCTETS INTO IP ARRAY |
|||
250 BY=0:N=0 |
|||
260 FOR I=1 TO SL-1 |
|||
270 : C$=MID$(CI$,I,1):IF C$<>"." THEN 300 |
|||
280 : IP(N)=BY:N=N+1:BY=0:IF IP(N-1)<256 THEN 310 |
|||
290 : PRINT "INVALID OCTET VALUE:"IP(N-1):GOTO 140 |
|||
300 : C=VAL(C$):IF C OR (C$="0") THEN BY=BY*10+C |
|||
310 NEXT I |
|||
320 IP(N)=BY:N=N+1:IF IP(N-1)>255 THEN 290 |
|||
330 REM NUMBER OF COMPLETE OCTETS IN NETWORK PART |
|||
340 NB=INT(NW/8) |
|||
350 REM NUMBER OF NETWORK BITS IN PARTIAL OCTET |
|||
360 XB=NW AND 7 |
|||
370 REM ZERO OUT HOST BITS IN PARTIAL OCTET |
|||
380 IP(NB) = IP(NB) AND (255 - 2^(8-XB) + 1) |
|||
390 REM AND SET ANY ALL-HOST OCTETS TO 0 |
|||
400 IF NB<3 THEN FOR I=NB+1 TO 3:IP(I)=0 :NEXT I |
|||
410 REM PRINT OUT THE RESULT |
|||
420 PRINT MID$(STR$(IP(0)),2); |
|||
430 FOR I=1 TO 3: PRINT "."MID$(STR$(IP( I)),2);:NEXT I |
|||
440 PRINT MID$(CI$,SL) |
|||
450 REM AND GO BACK FOR NEXT INPUT |
|||
460 GOTO 140 |
|||
500 DATA 87.70.141.1/22, 36.18.154.103/12, 62.62.197.11/29 |
|||
510 DATA 67.137.119.181/4, 161.214.74.21/24, 184.232.176.184/18 |
|||
520 REM SOME INVALID INPUTS |
|||
530 DATA 127.0.0.1, 123.45.67.89/0, 98.76.54.32/100, 123.456.789.0/12 |
|||
540 DATA</lang> |
|||
{{Out}}<pre>READY. |
|||
RUN |
|||
87.70.140.0/22 |
|||
36.16.0.0/12 |
|||
62.62.197.8/29 |
|||
64.0.0.0/4 |
|||
161.214.74.0/24 |
|||
184.232.128.0/18 |
|||
INVALID CIDR STRING: '127.0.0.1' |
|||
INVALID NETWORK WIDTH: 0 |
|||
INVALID NETWORK WIDTH: 100 |
|||
INVALID OCTET VALUE: 456 |
|||
READY.</pre> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |
||
<lang lisp>(defun ip->bit-vector (ip) |
<lang lisp>(defun ip->bit-vector (ip) |