diff --git a/AK/AKString.h b/AK/AKString.h index bec22ec886..8606d2934e 100755 --- a/AK/AKString.h +++ b/AK/AKString.h @@ -92,6 +92,7 @@ public: static String repeated(char, int count); bool matches(const StringView& pattern, CaseSensitivity = CaseSensitivity::CaseInsensitive) const; + // FIXME: These should be shared between String and StringView somehow! int to_int(bool& ok) const; unsigned to_uint(bool& ok) const; diff --git a/AK/StringView.cpp b/AK/StringView.cpp index 14a26c7f18..2e33eb9645 100644 --- a/AK/StringView.cpp +++ b/AK/StringView.cpp @@ -66,6 +66,34 @@ StringView StringView::substring_view_starting_after_substring(const StringView& return { remaining_characters, remaining_length }; } +int StringView::to_int(bool& ok) const +{ + bool negative = false; + int value = 0; + int i = 0; + + if (is_empty()) { + ok = false; + return 0; + } + + if (characters_without_null_termination()[0] == '-') { + i++; + negative = true; + } + for (; i < length(); i++) { + if (characters_without_null_termination()[i] < '0' || characters_without_null_termination()[i] > '9') { + ok = false; + return 0; + } + value = value * 10; + value += characters_without_null_termination()[i] - '0'; + } + ok = true; + + return negative ? -value : value; +} + unsigned StringView::to_uint(bool& ok) const { unsigned value = 0; diff --git a/AK/StringView.h b/AK/StringView.h index b36cf40db2..7d5d50a99f 100644 --- a/AK/StringView.h +++ b/AK/StringView.h @@ -41,7 +41,10 @@ public: StringView substring_view(int start, int length) const; Vector split_view(char) const; + + // FIXME: These should be shared between String and StringView somehow! unsigned to_uint(bool& ok) const; + int to_int(bool& ok) const; // Create a new substring view of this string view, starting either at the beginning of // the given substring view, or after its end, and continuing until the end of this string