Skip to content

Commit 4a2a447

Browse files
committed
Fixed danmar#6281: MathLib: Long integer suffix i64 is not supported.
1 parent f5d804f commit 4a2a447

File tree

2 files changed

+96
-6
lines changed

2 files changed

+96
-6
lines changed

lib/mathlib.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,16 +368,16 @@ bool MathLib::isHex(const std::string& s)
368368

369369
bool MathLib::isValidSuffix(std::string::const_iterator it, std::string::const_iterator end)
370370
{
371-
enum Status {
372-
START, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU
373-
} state = START;
371+
enum {START, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU, SUFFIX_I, SUFFIX_I6, SUFFIX_I64} state = START;
374372
for (; it != end; ++it) {
375373
switch (state) {
376374
case START:
377375
if (*it == 'u' || *it == 'U')
378376
state = SUFFIX_U;
379377
else if (*it == 'l' || *it == 'L')
380378
state = SUFFIX_L;
379+
else if (*it == 'i')
380+
state = SUFFIX_I;
381381
else
382382
return false;
383383
break;
@@ -409,13 +409,31 @@ bool MathLib::isValidSuffix(std::string::const_iterator it, std::string::const_i
409409
else
410410
return false;
411411
break;
412+
case SUFFIX_I:
413+
if (*it == '6')
414+
state = SUFFIX_I6;
415+
else
416+
return false;
417+
break;
418+
case SUFFIX_I6:
419+
if (*it == '4')
420+
state = SUFFIX_I64;
421+
else
422+
return false;
423+
break;
412424
default:
413425
return false;
426+
break;
414427
}
415428
}
416-
return (state == SUFFIX_U) || (state == SUFFIX_L)
417-
|| (state == SUFFIX_UL) || (state == SUFFIX_LU) || (state == SUFFIX_LL)
418-
|| (state == SUFFIX_ULL) || (state == SUFFIX_LLU);
429+
return ((state == SUFFIX_U) ||
430+
(state == SUFFIX_L) ||
431+
(state == SUFFIX_UL) ||
432+
(state == SUFFIX_LU) ||
433+
(state == SUFFIX_LL) ||
434+
(state == SUFFIX_ULL) ||
435+
(state == SUFFIX_LLU) ||
436+
(state == SUFFIX_I64));
419437
}
420438

421439
/*! \brief Does the string represent a binary number?

test/testmathlib.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class TestMathLib : public TestFixture {
3636
TEST_CASE(isdec);
3737
TEST_CASE(isoct);
3838
TEST_CASE(ishex);
39+
TEST_CASE(isValidSuffix);
3940
TEST_CASE(isnegative);
4041
TEST_CASE(ispositive);
4142
TEST_CASE(isfloat);
@@ -533,6 +534,77 @@ class TestMathLib : public TestFixture {
533534
ASSERT_EQUALS(false, MathLib::isHex(""));
534535
}
535536

537+
void isValidSuffix(void)
538+
{
539+
// negative testing
540+
std::string value = "ux";
541+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
542+
543+
value = "ulx";
544+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
545+
546+
value = "lx";
547+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
548+
549+
value = "lux";
550+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
551+
552+
value = "lll";
553+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
554+
555+
value = "garbage";
556+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
557+
558+
value = "";
559+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
560+
561+
value = "llu ";
562+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
563+
564+
value = "i";
565+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
566+
567+
value = "iX";
568+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
569+
570+
value = "i6X";
571+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
572+
573+
value = "i64X";
574+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
575+
576+
value = "i64 ";
577+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
578+
579+
value = "i66";
580+
ASSERT_EQUALS(false, MathLib::isValidSuffix(value.begin(), value.end()));
581+
582+
// positive testing
583+
value = "u";
584+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
585+
586+
value = "ul";
587+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
588+
589+
value = "ull";
590+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
591+
592+
value = "l";
593+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
594+
595+
value = "lu";
596+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
597+
598+
value = "ll";
599+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
600+
601+
value = "llu";
602+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
603+
604+
value = "i64";
605+
ASSERT_EQUALS(true, MathLib::isValidSuffix(value.begin(), value.end()));
606+
}
607+
536608
void ispositive() const
537609
{
538610
ASSERT_EQUALS(false, MathLib::isPositive("-1"));

0 commit comments

Comments
 (0)