Canonicalize CIDR: Difference between revisions

Added 11l
(Added 11l)
Line 28:
</pre>
<br><br>
=={{header|11l}}==
{{trans|C}}
 
<lang 11l>F cidr_parse(str)
V (addr_str, m_str) = str.split(‘/’)
V (a, b, c, d) = addr_str.split(‘.’).map(Int)
V m = Int(m_str)
I m < 1 | m > 32
| a < 0 | a > 255
| b < 0 | b > 255
| c < 0 | c > 255
| d < 0 | d > 255
R (0, 0)
V mask = (-)((1 << (32 - m)) - 1)
V address = (a << 24) + (b << 16) + (c << 8) + d
address [&]= mask
R (address, m)
 
F cidr_format(=address, mask_length)
V d = address [&] F'F
address >>= 8
V c = address [&] F'F
address >>= 8
V b = address [&] F'F
address >>= 8
V a = address [&] F'F
R a‘.’b‘.’c‘.’d‘/’mask_length
 
L(test) [‘87.70.141.1/22’,
‘36.18.154.103/12’,
‘62.62.197.11/29’,
‘67.137.119.181/4’,
‘161.214.74.21/24’,
‘184.232.176.184/18’]
V (address, mask_length) = cidr_parse(test)
print(‘#<18 -> #.’.format(test, cidr_format(address, mask_length)))</lang>
 
{{out}}
<pre>
87.70.141.1/22 -> 87.70.140.0/22
36.18.154.103/12 -> 36.16.0.0/12
62.62.197.11/29 -> 62.62.197.8/29
67.137.119.181/4 -> 64.0.0.0/4
161.214.74.21/24 -> 161.214.74.0/24
184.232.176.184/18 -> 184.232.128.0/18
</pre>
 
=={{header|C}}==
This solution uses only the standard library. On POSIX platforms one can use the functions
1,481

edits