1797: def self.create(arg)
1798: case arg
1799: when IPv6
1800: return arg
1801: when String
1802: address = ''
1803: if Regex_8Hex =~ arg
1804: arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1805: elsif Regex_CompressedHex =~ arg
1806: prefix = $1
1807: suffix = $2
1808: a1 = ''
1809: a2 = ''
1810: prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1811: suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1812: omitlen = 16 - a1.length - a2.length
1813: address << a1 << "\0" * omitlen << a2
1814: elsif Regex_6Hex4Dec =~ arg
1815: prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
1816: if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1817: prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
1818: address << [a, b, c, d].pack('CCCC')
1819: else
1820: raise ArgumentError.new("not numeric IPv6 address: " + arg)
1821: end
1822: elsif Regex_CompressedHex4Dec =~ arg
1823: prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
1824: if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
1825: a1 = ''
1826: a2 = ''
1827: prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
1828: suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
1829: omitlen = 12 - a1.length - a2.length
1830: address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
1831: else
1832: raise ArgumentError.new("not numeric IPv6 address: " + arg)
1833: end
1834: else
1835: raise ArgumentError.new("not numeric IPv6 address: " + arg)
1836: end
1837: return IPv6.new(address)
1838: else
1839: raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
1840: end
1841: end