From 896c3c0414624296e4c0a94bf18a643cada59504 Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Fri, 15 Nov 2024 03:50:22 -0800 Subject: [PATCH] feat(big): add SBigFromStr --- storm/Big.cpp | 4 ++++ storm/Big.hpp | 2 ++ storm/big/Ops.cpp | 8 ++++++++ storm/big/Ops.hpp | 2 ++ test/Big.cpp | 26 ++++++++++++++++++++++++++ 5 files changed, 42 insertions(+) diff --git a/storm/Big.cpp b/storm/Big.cpp index de16fbe..4a3cc70 100644 --- a/storm/Big.cpp +++ b/storm/Big.cpp @@ -48,6 +48,10 @@ void SBigFromBinary(BigData* num, const void* data, uint32_t bytes) { FromBinary(num->Primary(), data, bytes); } +void SBigFromStr(BigData* num, const char *str) { + FromStr(num->Primary(), str); +} + void SBigFromUnsigned(BigData* num, uint32_t val) { FromUnsigned(num->Primary(), val); } diff --git a/storm/Big.hpp b/storm/Big.hpp index 086395a..027368e 100644 --- a/storm/Big.hpp +++ b/storm/Big.hpp @@ -20,6 +20,8 @@ void SBigDel(BigData* num); void SBigFromBinary(BigData* num, const void* data, uint32_t bytes); +void SBigFromStr(BigData* num, const char* str); + void SBigFromUnsigned(BigData* num, uint32_t val); void SBigMod(BigData* a, BigData* b, BigData* c); diff --git a/storm/big/Ops.cpp b/storm/big/Ops.cpp index 9b0b17c..61a783c 100644 --- a/storm/big/Ops.cpp +++ b/storm/big/Ops.cpp @@ -167,6 +167,14 @@ void FromBinary(BigBuffer& buffer, const void* data, uint32_t bytes) { } } +void FromStr(BigBuffer& buffer, const char* str) { + SetZero(buffer); + for (; *str; str++) { + Mul(buffer, buffer, 10); + Add(buffer, buffer, *str - '0'); + } +} + void FromUnsigned(BigBuffer& buffer, uint32_t value) { buffer[0] = value; buffer.SetCount(1); diff --git a/storm/big/Ops.hpp b/storm/big/Ops.hpp index b781a7e..7a84657 100644 --- a/storm/big/Ops.hpp +++ b/storm/big/Ops.hpp @@ -25,6 +25,8 @@ uint32_t ExtractLowPartSx(uint64_t& value); void FromBinary(BigBuffer& buffer, const void* value, uint32_t bytes); +void FromStr(BigBuffer& buffer, const char* str); + void FromUnsigned(BigBuffer& buffer, uint32_t value); uint32_t HighBitPos(const BigBuffer& buffer); diff --git a/test/Big.cpp b/test/Big.cpp index a109b2d..03b94c4 100644 --- a/test/Big.cpp +++ b/test/Big.cpp @@ -281,6 +281,32 @@ TEST_CASE("SBigFromBinary", "[big]") { } } +TEST_CASE("SBigFromStr", "[big]") { + BigDataTest num; + + SECTION("with empty string") { + SBigFromStr(num, ""); + + CHECK(num->Primary().Count() == 0); + } + + SECTION("with string containing numbers") { + SBigFromStr(num, "123456"); + + CHECK(num->Primary().Count() == 1); + CHECK(num->Primary()[0] == 123456); + } + + SECTION("with string containing letters (original bug)") { + SBigFromStr(num, "ABC"); + + const unsigned int expected_num = ('A' - '0') * 100 + ('B' - '0') * 10 + ('C' - '0'); + + CHECK(num->Primary().Count() == 1); + CHECK(num->Primary()[0] == expected_num); + } +} + TEST_CASE("SBigFromUnsigned", "[big]") { SECTION("creates bigdata from 0") { BigData* num;