From cce2ea9bb018f39b0e41b865b35a9b66e55075b2 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 4 Aug 2019 11:44:20 +0200 Subject: [PATCH] AK: Add StringView::to_int() This is a shameless copy-paste of String::to_int(). We should find some way to share this code between String and StringView instead of having two duplicate copies like this. --- AK/AKString.h | 1 + AK/StringView.cpp | 28 ++++++++++++++++++++++++++++ AK/StringView.h | 3 +++ 3 files changed, 32 insertions(+) diff --git a/AK/AKString.h b/AK/AKString.h index bec22ec886a..8606d2934e4 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 14a26c7f18f..2e33eb9645b 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 b36cf40db2b..7d5d50a99f1 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