1843: def self.create(arg)
1844: case arg
1845: when IPv6
1846: return arg
1847: when String
1848: address = ''
1849: if Regex_8Hex =~ arg
1850: arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1851: elsif Regex_CompressedHex =~ arg
1852: prefix = $1
1853: suffix = $2
1854: a1 = ''
1855: a2 = ''
1856: prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1857: suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1858: omitlen = 16 - a1.length - a2.length
1859: address << a1 << "\0" * omitlen << a2
1860: elsif Regex_6Hex4Dec =~ arg
1861: prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
1862: if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1863: prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1864: address << [a, b, c, d].pack('CCCC')
1865: else
1866: raise ArgumentError.new("not numeric IPv6 address: " + arg)
1867: end
1868: elsif Regex_CompressedHex4Dec =~ arg
1869: prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
1870: if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1871: a1 = ''
1872: a2 = ''
1873: prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1874: suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1875: omitlen = 12 - a1.length - a2.length
1876: address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
1877: else
1878: raise ArgumentError.new("not numeric IPv6 address: " + arg)
1879: end
1880: else
1881: raise ArgumentError.new("not numeric IPv6 address: " + arg)
1882: end
1883: return IPv6.new(address)
1884: else
1885: raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
1886: end
1887: end