From dddcedfd11c36631f997757c4ecfd6fdbaa4235c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 8 Jul 2019 11:38:58 +0200 Subject: [PATCH] AK: Add IPv4Address::from_string(StringView). This attempts to parse an IPv4Address from a string, and gives us an excuse to try out the new Optional for the return value. :^) --- AK/IPv4Address.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/AK/IPv4Address.h b/AK/IPv4Address.h index 36223043b0..d77366377a 100644 --- a/AK/IPv4Address.h +++ b/AK/IPv4Address.h @@ -2,6 +2,9 @@ #include #include +#include + +typedef u32 in_addr_t; namespace AK { @@ -39,6 +42,31 @@ public: return String::format("%u.%u.%u.%u", m_data[0], m_data[1], m_data[2], m_data[3]); } + static Optional from_string(const StringView& string) + { + if (string.is_null()) + return {}; + auto parts = string.split_view('.'); + if (parts.size() != 4) + return {}; + bool ok; + auto a = parts[0].to_uint(ok); + if (!ok || a > 255) + return {}; + auto b = parts[1].to_uint(ok); + if (!ok || b > 255) + return {}; + auto c = parts[2].to_uint(ok); + if (!ok || c > 255) + return {}; + auto d = parts[3].to_uint(ok); + if (!ok || d > 255) + return {}; + return IPv4Address((u8)a, (u8)b, (u8)c, (u8)d); + } + + in_addr_t to_in_addr_t() const { return m_data_as_u32; } + bool operator==(const IPv4Address& other) const { return m_data_as_u32 == other.m_data_as_u32; } bool operator!=(const IPv4Address& other) const { return m_data_as_u32 != other.m_data_as_u32; }