From 414f6a30670a1b3bf475477511b62ab463cdff9b Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 3 May 2025 07:47:15 +0200 Subject: [PATCH] Codechange: add support for parsing octal numbers --- src/core/string_consumer.cpp | 3 +++ src/core/string_consumer.hpp | 2 +- src/tests/string_consumer.cpp | 20 +++++++++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/core/string_consumer.cpp b/src/core/string_consumer.cpp index 75568bc812..c878388939 100644 --- a/src/core/string_consumer.cpp +++ b/src/core/string_consumer.cpp @@ -186,6 +186,9 @@ void StringConsumer::SkipIntegerBase(int base) default: assert(false); break; + case 8: + this->SkipUntilCharNotIn("01234567"); + break; case 10: this->SkipUntilCharNotIn("0123456789"); break; diff --git a/src/core/string_consumer.hpp b/src/core/string_consumer.hpp index 720b37c7a3..74febc5783 100644 --- a/src/core/string_consumer.hpp +++ b/src/core/string_consumer.hpp @@ -829,7 +829,7 @@ private: } T value{}; - assert(base == 10 || base == 16); // we only support these bases when skipping + assert(base == 8 || base == 10 || base == 16); // we only support these bases when skipping auto result = std::from_chars(src.data(), src.data() + src.size(), value, base); auto len = result.ptr - src.data(); if (result.ec == std::errc::result_out_of_range) { diff --git a/src/tests/string_consumer.cpp b/src/tests/string_consumer.cpp index b5fae4316a..d07e67c996 100644 --- a/src/tests/string_consumer.cpp +++ b/src/tests/string_consumer.cpp @@ -268,9 +268,11 @@ TEST_CASE("StringConsumer - ascii") TEST_CASE("StringConsumer - parse int") { - StringConsumer consumer("1 a -a -2 -2 ffffFFFF ffffFFFF -1aaaAAAA -1aaaAAAA +3 1234567890123 1234567890123 1234567890123 ffffFFFFffffFFFE ffffFFFFffffFFFE ffffFFFFffffFFFE ffffFFFFffffFFFE -0x1aaaAAAAaaaaAAAA -1234567890123 "sv); + StringConsumer consumer("1 a -a -2 -8 ffffFFFF ffffFFFF -1aaaAAAA -1aaaAAAA +3 1234567890123 1234567890123 1234567890123 ffffFFFFffffFFFE ffffFFFFffffFFFE ffffFFFFffffFFFE ffffFFFFffffFFFE -0x1aaaAAAAaaaaAAAA -1234567890123 "sv); CHECK(consumer.PeekIntegerBase(0) == std::pair(1, 1)); CHECK(consumer.PeekIntegerBase(0) == std::pair(1, 1)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(1, 1)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(1, 1)); CHECK(consumer.PeekIntegerBase(10) == std::pair(1, 1)); CHECK(consumer.PeekIntegerBase(10) == std::pair(1, 1)); CHECK(consumer.PeekIntegerBase(16) == std::pair(1, 1)); @@ -279,6 +281,8 @@ TEST_CASE("StringConsumer - parse int") CHECK(consumer.ReadUtf8() == ' '); CHECK(consumer.PeekIntegerBase(0) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(0) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(16) == std::pair(1, 0xa)); @@ -287,6 +291,8 @@ TEST_CASE("StringConsumer - parse int") CHECK(consumer.ReadUtf8() == ' '); CHECK(consumer.PeekIntegerBase(0) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(0) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(16) == std::pair(0, 0)); @@ -295,6 +301,8 @@ TEST_CASE("StringConsumer - parse int") CHECK(consumer.ReadUtf8() == ' '); CHECK(consumer.PeekIntegerBase(0) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(0) == std::pair(2, -2)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(2, -2)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(2, -2)); CHECK(consumer.PeekIntegerBase(16) == std::pair(0, 0)); @@ -302,10 +310,14 @@ TEST_CASE("StringConsumer - parse int") CHECK(consumer.TryReadIntegerBase(10) == std::nullopt); CHECK(consumer.ReadIntegerBase(10) == 0); CHECK(consumer.ReadUtf8() == ' '); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); + CHECK(consumer.TryReadIntegerBase(8) == std::nullopt); + CHECK(consumer.TryReadIntegerBase(8) == std::nullopt); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); - CHECK(consumer.PeekIntegerBase(10) == std::pair(2, -2)); + CHECK(consumer.PeekIntegerBase(10) == std::pair(2, -8)); CHECK(consumer.TryReadIntegerBase(10) == std::nullopt); - CHECK(consumer.ReadIntegerBase(10) == -2); + CHECK(consumer.ReadIntegerBase(10) == -8); CHECK(consumer.ReadUtf8() == ' '); CHECK(consumer.PeekIntegerBase(16) == std::pair(8, 0xffffffff)); CHECK(consumer.PeekIntegerBase(16) == std::pair(0, 0)); @@ -324,6 +336,8 @@ TEST_CASE("StringConsumer - parse int") CHECK(consumer.TryReadIntegerBase(16) == std::nullopt); CHECK(consumer.ReadIntegerBase(16) == -0x1aaaaaaa); CHECK(consumer.ReadUtf8() == ' '); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); + CHECK(consumer.PeekIntegerBase(8) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); CHECK(consumer.PeekIntegerBase(10) == std::pair(0, 0)); consumer.SkipIntegerBase(10);