Skip to content

Commit f7afc58

Browse files
committed
uint64 and int64 based string helpers
1 parent b4ce526 commit f7afc58

6 files changed

Lines changed: 204 additions & 79 deletions

File tree

common/strings/Format.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ using std::endl;
3131
using std::ostringstream;
3232
using std::string;
3333

34-
string IntToString(int i) {
34+
string IntToString(int64_t i) {
3535
ostringstream str;
3636
str << i;
3737
return str.str();
3838
}
3939

40-
string IntToString(unsigned int i) {
40+
string IntToString(uint64_t i) {
4141
ostringstream str;
4242
str << i;
4343
return str.str();

common/utils/StringUtils.cpp

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,15 @@ bool StringToBoolTolerant(const string &value, bool *output) {
152152
return false;
153153
}
154154

155-
bool StringToInt(const string &value, unsigned int *output, bool strict) {
155+
bool StringToInt(const string &value, uint64_t *output, bool strict) {
156156
if (value.empty()) {
157157
return false;
158158
}
159159
char *end_ptr;
160160
errno = 0;
161-
long long l = strtoll(value.data(), &end_ptr, 10); // NOLINT(runtime/int)
162-
if (l < 0 || (l == 0 && errno != 0)) {
161+
unsigned long long l = strtoull( // NOLINT(runtime/int)
162+
value.data(), &end_ptr, 10);
163+
if (l == 0 && errno != 0) {
163164
return false;
164165
}
165166
if (value == end_ptr) {
@@ -168,15 +169,27 @@ bool StringToInt(const string &value, unsigned int *output, bool strict) {
168169
if (strict && *end_ptr != 0) {
169170
return false;
170171
}
171-
if (l > static_cast<long long>(UINT32_MAX)) { // NOLINT(runtime/int)
172+
if (l > static_cast<unsigned long long>(UINT64_MAX)) { // NOLINT(runtime/int)
173+
return false;
174+
}
175+
*output = static_cast<uint64_t>(l);
176+
return true;
177+
}
178+
179+
bool StringToInt(const string &value, unsigned int *output, bool strict) {
180+
uint64_t v;
181+
if (!StringToInt(value, &v, strict)) {
182+
return false;
183+
}
184+
if (v > UINT32_MAX) {
172185
return false;
173186
}
174-
*output = static_cast<unsigned int>(l);
187+
*output = static_cast<unsigned int>(v);
175188
return true;
176189
}
177190

178191
bool StringToInt(const string &value, uint16_t *output, bool strict) {
179-
unsigned int v;
192+
uint64_t v;
180193
if (!StringToInt(value, &v, strict)) {
181194
return false;
182195
}
@@ -188,7 +201,7 @@ bool StringToInt(const string &value, uint16_t *output, bool strict) {
188201
}
189202

190203
bool StringToInt(const string &value, uint8_t *output, bool strict) {
191-
unsigned int v;
204+
uint64_t v;
192205
if (!StringToInt(value, &v, strict)) {
193206
return false;
194207
}
@@ -199,7 +212,7 @@ bool StringToInt(const string &value, uint8_t *output, bool strict) {
199212
return true;
200213
}
201214

202-
bool StringToInt(const string &value, int *output, bool strict) {
215+
bool StringToInt(const string &value, int64_t *output, bool strict) {
203216
if (value.empty()) {
204217
return false;
205218
}
@@ -215,15 +228,27 @@ bool StringToInt(const string &value, int *output, bool strict) {
215228
if (strict && *end_ptr != 0) {
216229
return false;
217230
}
218-
if (l < INT32_MIN || l > INT32_MAX) {
231+
if (l < INT64_MIN || l > INT64_MAX) {
219232
return false;
220233
}
221-
*output = static_cast<unsigned int>(l);
234+
*output = static_cast<int64_t>(l);
235+
return true;
236+
}
237+
238+
bool StringToInt(const string &value, int *output, bool strict) {
239+
int64_t v;
240+
if (!StringToInt(value, &v, strict)) {
241+
return false;
242+
}
243+
if (v < INT32_MIN || v > INT32_MAX) {
244+
return false;
245+
}
246+
*output = static_cast<int>(v);
222247
return true;
223248
}
224249

225250
bool StringToInt(const string &value, int16_t *output, bool strict) {
226-
int v;
251+
int64_t v;
227252
if (!StringToInt(value, &v, strict)) {
228253
return false;
229254
}
@@ -235,7 +260,7 @@ bool StringToInt(const string &value, int16_t *output, bool strict) {
235260
}
236261

237262
bool StringToInt(const string &value, int8_t *output, bool strict) {
238-
int v;
263+
int64_t v;
239264
if (!StringToInt(value, &v, strict)) {
240265
return false;
241266
}
@@ -364,6 +389,19 @@ bool HexStringToInt(const string &value, uint32_t *output) {
364389
return true;
365390
}
366391

392+
bool HexStringToInt(const string &value, uint64_t *output) {
393+
if (value.empty()) {
394+
return false;
395+
}
396+
397+
size_t found = value.find_first_not_of("ABCDEFabcdef0123456789");
398+
if (found != string::npos) {
399+
return false;
400+
}
401+
*output = strtoull(value.data(), NULL, 16);
402+
return true;
403+
}
404+
367405
bool HexStringToInt(const string &value, int8_t *output) {
368406
int32_t temp;
369407
if (!HexStringToInt(value, &temp)) {
@@ -401,6 +439,19 @@ bool HexStringToInt(const string &value, int32_t *output) {
401439
return true;
402440
}
403441

442+
bool HexStringToInt(const string &value, int64_t *output) {
443+
if (value.empty()) {
444+
return false;
445+
}
446+
447+
size_t found = value.find_first_not_of("ABCDEFabcdef0123456789");
448+
if (found != string::npos) {
449+
return false;
450+
}
451+
*output = strtoll(value.data(), NULL, 16);
452+
return true;
453+
}
454+
404455
void ToLower(string *s) {
405456
std::transform(s->begin(), s->end(), s->begin(),
406457
std::ptr_fun<int, int>(std::tolower));

common/utils/StringUtilsTest.cpp

Lines changed: 78 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ void StringUtilsTest::testIntToHexString() {
351351
OLA_ASSERT_EQ(string("0x0001"), IntToHexString((uint16_t)0x0001));
352352
OLA_ASSERT_EQ(string("0xabcd"), IntToHexString((uint16_t)0xABCD));
353353
OLA_ASSERT_EQ(string("0xdeadbeef"), IntToHexString((uint32_t)0xDEADBEEF));
354+
// Deliberately no IntToHexString(uint64_t) or test as its deprecated
354355

355356
unsigned int i = 0x42;
356357
OLA_ASSERT_EQ(string("0x00000042"), IntToHexString(i));
@@ -381,6 +382,10 @@ void StringUtilsTest::testIntToHexString() {
381382
OLA_ASSERT_EQ(string("0xdeadbeef"), str.str());
382383
str.str("");
383384

385+
str << ToHex((uint64_t)0xDEADBEEFFEEDFACE);
386+
OLA_ASSERT_EQ(string("0xdeadbeeffeedface"), str.str());
387+
str.str("");
388+
384389
str << ToHex(i);
385390
OLA_ASSERT_EQ(string("0x00000042"), str.str());
386391
str.str("");
@@ -552,6 +557,9 @@ void StringUtilsTest::testStringToUInt() {
552557
OLA_ASSERT_EQ(65537u, value);
553558
OLA_ASSERT_TRUE(StringToInt("4294967295", &value));
554559
OLA_ASSERT_EQ(4294967295U, value);
560+
uint64_t value2;
561+
OLA_ASSERT_TRUE(StringToInt("77000000000", &value2));
562+
OLA_ASSERT_EQ((uint64_t) 77000000000, value2);
555563
OLA_ASSERT_FALSE(StringToInt("4294967296", &value));
556564
OLA_ASSERT_FALSE(StringToInt("foo", &value));
557565

@@ -569,7 +577,9 @@ void StringUtilsTest::testStringToUIntOrDefault() {
569577
OLA_ASSERT_EQ(0u, StringToIntOrDefault("0", 42u));
570578
OLA_ASSERT_EQ(1u, StringToIntOrDefault("1", 42u));
571579
OLA_ASSERT_EQ(65537u, StringToIntOrDefault("65537", 42u));
572-
OLA_ASSERT_EQ(4294967295U, StringToIntOrDefault("4294967295", 42u));
580+
OLA_ASSERT_EQ(4294967295U, StringToIntOrDefault("4294967295", 42U));
581+
OLA_ASSERT_EQ((uint64_t) 77000000000,
582+
StringToIntOrDefault("77000000000", (uint64_t) 42));
573583
OLA_ASSERT_EQ(42u, StringToIntOrDefault("4294967296", 42u));
574584
OLA_ASSERT_EQ(42u, StringToIntOrDefault("foo", 42u));
575585

@@ -648,97 +658,102 @@ void StringUtilsTest::testHexStringToInt() {
648658
OLA_ASSERT_FALSE(HexStringToInt("zfff", &value2));
649659
OLA_ASSERT_FALSE(HexStringToInt("0xf", &value2));
650660

651-
// int8_t
652-
int8_t value3;
653-
OLA_ASSERT_FALSE(HexStringToInt("", &value3));
654-
OLA_ASSERT_FALSE(HexStringToInt("-1", &value3));
655-
656-
OLA_ASSERT_TRUE(HexStringToInt("0", &value3));
657-
OLA_ASSERT_EQ((int8_t) 0, value3);
658-
OLA_ASSERT_TRUE(HexStringToInt("1", &value3));
659-
OLA_ASSERT_EQ((int8_t) 1, value3);
660-
OLA_ASSERT_TRUE(HexStringToInt("a", &value3));
661-
OLA_ASSERT_EQ((int8_t) 10, value3);
662-
OLA_ASSERT_TRUE(HexStringToInt("f", &value3));
663-
OLA_ASSERT_EQ((int8_t) 15, value3);
664-
OLA_ASSERT_TRUE(HexStringToInt("7f", &value3));
665-
OLA_ASSERT_EQ((int8_t) 127, value3);
666-
OLA_ASSERT_TRUE(HexStringToInt("a1", &value3));
667-
OLA_ASSERT_EQ((int8_t) -95, value3);
668-
OLA_ASSERT_TRUE(HexStringToInt("80", &value3));
669-
OLA_ASSERT_EQ((int8_t) -128, value3);
670-
OLA_ASSERT_TRUE(HexStringToInt("ff", &value3));
671-
OLA_ASSERT_EQ((int8_t) -1, value3);
672-
673-
OLA_ASSERT_FALSE(HexStringToInt("ffff", &value3));
674-
OLA_ASSERT_FALSE(HexStringToInt("fff0", &value3));
675-
OLA_ASSERT_FALSE(HexStringToInt("ffffff", &value3));
676-
OLA_ASSERT_FALSE(HexStringToInt("ffffffff", &value3));
677-
OLA_ASSERT_FALSE(HexStringToInt("ef123456", &value3));
678-
OLA_ASSERT_FALSE(HexStringToInt("fz", &value3));
679-
OLA_ASSERT_FALSE(HexStringToInt("zfff", &value3));
680-
OLA_ASSERT_FALSE(HexStringToInt("0xf", &value3));
661+
// uint64_t
662+
uint64_t value3;
663+
OLA_ASSERT_TRUE(HexStringToInt("11ed8ec200", &value3));
664+
OLA_ASSERT_EQ((uint64_t) 77000000000, value3);
681665

682-
// int16_t
683-
int16_t value4;
666+
// int8_t
667+
int8_t value4;
684668
OLA_ASSERT_FALSE(HexStringToInt("", &value4));
685669
OLA_ASSERT_FALSE(HexStringToInt("-1", &value4));
686670

687671
OLA_ASSERT_TRUE(HexStringToInt("0", &value4));
688-
OLA_ASSERT_EQ((int16_t) 0, value4);
672+
OLA_ASSERT_EQ((int8_t) 0, value4);
689673
OLA_ASSERT_TRUE(HexStringToInt("1", &value4));
690-
OLA_ASSERT_EQ((int16_t) 1, value4);
674+
OLA_ASSERT_EQ((int8_t) 1, value4);
691675
OLA_ASSERT_TRUE(HexStringToInt("a", &value4));
692-
OLA_ASSERT_EQ((int16_t) 10, value4);
676+
OLA_ASSERT_EQ((int8_t) 10, value4);
693677
OLA_ASSERT_TRUE(HexStringToInt("f", &value4));
694-
OLA_ASSERT_EQ((int16_t) 15, value4);
678+
OLA_ASSERT_EQ((int8_t) 15, value4);
679+
OLA_ASSERT_TRUE(HexStringToInt("7f", &value4));
680+
OLA_ASSERT_EQ((int8_t) 127, value4);
695681
OLA_ASSERT_TRUE(HexStringToInt("a1", &value4));
696-
OLA_ASSERT_EQ((int16_t) 161, value4);
682+
OLA_ASSERT_EQ((int8_t) -95, value4);
683+
OLA_ASSERT_TRUE(HexStringToInt("80", &value4));
684+
OLA_ASSERT_EQ((int8_t) -128, value4);
697685
OLA_ASSERT_TRUE(HexStringToInt("ff", &value4));
698-
OLA_ASSERT_EQ((int16_t) 255, value4);
699-
OLA_ASSERT_TRUE(HexStringToInt("7fff", &value4));
700-
OLA_ASSERT_EQ((int16_t) 32767, value4);
701-
OLA_ASSERT_TRUE(HexStringToInt("ffff", &value4));
702-
OLA_ASSERT_EQ((int16_t) -1, value4);
703-
OLA_ASSERT_TRUE(HexStringToInt("fff0", &value4));
704-
OLA_ASSERT_EQ((int16_t) -16, value4);
705-
OLA_ASSERT_TRUE(HexStringToInt("8000", &value4));
706-
OLA_ASSERT_EQ((int16_t) -32768, value4);
686+
OLA_ASSERT_EQ((int8_t) -1, value4);
707687

688+
OLA_ASSERT_FALSE(HexStringToInt("ffff", &value4));
689+
OLA_ASSERT_FALSE(HexStringToInt("fff0", &value4));
708690
OLA_ASSERT_FALSE(HexStringToInt("ffffff", &value4));
709691
OLA_ASSERT_FALSE(HexStringToInt("ffffffff", &value4));
710692
OLA_ASSERT_FALSE(HexStringToInt("ef123456", &value4));
711693
OLA_ASSERT_FALSE(HexStringToInt("fz", &value4));
712694
OLA_ASSERT_FALSE(HexStringToInt("zfff", &value4));
713695
OLA_ASSERT_FALSE(HexStringToInt("0xf", &value4));
714696

715-
// int32
716-
int32_t value5;
697+
// int16_t
698+
int16_t value5;
717699
OLA_ASSERT_FALSE(HexStringToInt("", &value5));
718700
OLA_ASSERT_FALSE(HexStringToInt("-1", &value5));
719701

720702
OLA_ASSERT_TRUE(HexStringToInt("0", &value5));
721-
OLA_ASSERT_EQ((int32_t) 0, value5);
703+
OLA_ASSERT_EQ((int16_t) 0, value5);
722704
OLA_ASSERT_TRUE(HexStringToInt("1", &value5));
723-
OLA_ASSERT_EQ((int32_t) 1, value5);
705+
OLA_ASSERT_EQ((int16_t) 1, value5);
724706
OLA_ASSERT_TRUE(HexStringToInt("a", &value5));
725-
OLA_ASSERT_EQ((int32_t) 10, value5);
707+
OLA_ASSERT_EQ((int16_t) 10, value5);
726708
OLA_ASSERT_TRUE(HexStringToInt("f", &value5));
727-
OLA_ASSERT_EQ((int32_t) 15, value5);
709+
OLA_ASSERT_EQ((int16_t) 15, value5);
728710
OLA_ASSERT_TRUE(HexStringToInt("a1", &value5));
729-
OLA_ASSERT_EQ((int32_t) 161, value5);
711+
OLA_ASSERT_EQ((int16_t) 161, value5);
730712
OLA_ASSERT_TRUE(HexStringToInt("ff", &value5));
731-
OLA_ASSERT_EQ((int32_t) 255, value5);
713+
OLA_ASSERT_EQ((int16_t) 255, value5);
732714
OLA_ASSERT_TRUE(HexStringToInt("7fff", &value5));
733-
OLA_ASSERT_EQ((int32_t) 32767, value5);
715+
OLA_ASSERT_EQ((int16_t) 32767, value5);
734716
OLA_ASSERT_TRUE(HexStringToInt("ffff", &value5));
735-
OLA_ASSERT_EQ((int32_t) 65535, value5);
736-
OLA_ASSERT_TRUE(HexStringToInt("ffffffff", &value5));
737-
OLA_ASSERT_EQ((int32_t) -1, value5);
738-
OLA_ASSERT_TRUE(HexStringToInt("fffffff0", &value5));
739-
OLA_ASSERT_EQ((int32_t) -16, value5);
740-
OLA_ASSERT_TRUE(HexStringToInt("80000000", &value5));
741-
OLA_ASSERT_EQ((int32_t) -2147483647 - 1, value5);
717+
OLA_ASSERT_EQ((int16_t) -1, value5);
718+
OLA_ASSERT_TRUE(HexStringToInt("fff0", &value5));
719+
OLA_ASSERT_EQ((int16_t) -16, value5);
720+
OLA_ASSERT_TRUE(HexStringToInt("8000", &value5));
721+
OLA_ASSERT_EQ((int16_t) -32768, value5);
722+
723+
OLA_ASSERT_FALSE(HexStringToInt("ffffff", &value5));
724+
OLA_ASSERT_FALSE(HexStringToInt("ffffffff", &value5));
725+
OLA_ASSERT_FALSE(HexStringToInt("ef123456", &value5));
726+
OLA_ASSERT_FALSE(HexStringToInt("fz", &value5));
727+
OLA_ASSERT_FALSE(HexStringToInt("zfff", &value5));
728+
OLA_ASSERT_FALSE(HexStringToInt("0xf", &value5));
729+
730+
// int32
731+
int32_t value6;
732+
OLA_ASSERT_FALSE(HexStringToInt("", &value6));
733+
OLA_ASSERT_FALSE(HexStringToInt("-1", &value6));
734+
735+
OLA_ASSERT_TRUE(HexStringToInt("0", &value6));
736+
OLA_ASSERT_EQ((int32_t) 0, value6);
737+
OLA_ASSERT_TRUE(HexStringToInt("1", &value6));
738+
OLA_ASSERT_EQ((int32_t) 1, value6);
739+
OLA_ASSERT_TRUE(HexStringToInt("a", &value6));
740+
OLA_ASSERT_EQ((int32_t) 10, value6);
741+
OLA_ASSERT_TRUE(HexStringToInt("f", &value6));
742+
OLA_ASSERT_EQ((int32_t) 15, value6);
743+
OLA_ASSERT_TRUE(HexStringToInt("a1", &value6));
744+
OLA_ASSERT_EQ((int32_t) 161, value6);
745+
OLA_ASSERT_TRUE(HexStringToInt("ff", &value6));
746+
OLA_ASSERT_EQ((int32_t) 255, value6);
747+
OLA_ASSERT_TRUE(HexStringToInt("7fff", &value6));
748+
OLA_ASSERT_EQ((int32_t) 32767, value6);
749+
OLA_ASSERT_TRUE(HexStringToInt("ffff", &value6));
750+
OLA_ASSERT_EQ((int32_t) 65535, value6);
751+
OLA_ASSERT_TRUE(HexStringToInt("ffffffff", &value6));
752+
OLA_ASSERT_EQ((int32_t) -1, value6);
753+
OLA_ASSERT_TRUE(HexStringToInt("fffffff0", &value6));
754+
OLA_ASSERT_EQ((int32_t) -16, value6);
755+
OLA_ASSERT_TRUE(HexStringToInt("80000000", &value6));
756+
OLA_ASSERT_EQ((int32_t) -2147483647 - 1, value6);
742757
}
743758

744759

0 commit comments

Comments
 (0)