libCom: Fix epicsTime::strftime() roll-over bug

Fractional seconds could round-up to .000 without
incrementing the integer seconds.
We can't actually do the latter, so we prevent the
roll-over and clamp at all 9's instead.
Idea from Eric Norum.
This commit is contained in:
Andrew Johnson
2014-01-29 16:52:22 -06:00
parent bfde24907c
commit b32127c5de
2 changed files with 17 additions and 3 deletions

View File

@@ -48,7 +48,7 @@ MAIN(epicsTimeTest)
const int wasteTime = 100000;
const int nTimes = 10;
testPlan(12 + nTimes * 18);
testPlan(15 + nTimes * 18);
try {
const epicsTimeStamp epochTS = {0, 0};
@@ -96,6 +96,10 @@ MAIN(epicsTimeTest)
et.strftime(buf, sizeof(buf), pFormat);
testOk(strcmp(buf, "1990-01-01 00.098765432") == 0, "'%s' => '%s'", pFormat, buf);
pFormat = "%S.%03f";
et.strftime(buf, sizeof(buf), pFormat);
testOk(strcmp(buf, "00.099") == 0, "'%s' => '%s'", pFormat, buf);
pFormat = "%S.%04f";
et.strftime(buf, sizeof(buf), pFormat);
testOk(strcmp(buf, "00.0988") == 0, "'%s' => '%s'", pFormat, buf);
@@ -113,6 +117,14 @@ MAIN(epicsTimeTest)
et.strftime(smbuf, sizeof(smbuf), pFormat);
testOk(strcmp(smbuf, "00.*") == 0, "'%s' => '%s'", pFormat, smbuf);
pFormat = "%S.%03f";
(et + 0.9).strftime(buf, sizeof(buf), pFormat);
testOk(strcmp(buf, "00.999") == 0, "0.998765 => '%s'", buf);
pFormat = "%S.%03f";
(et + 0.901).strftime(buf, sizeof(buf), pFormat);
testOk(strcmp(buf, "00.999") == 0, "0.999765 => '%s'", buf);
pFormat = "%%S.%%05f";
et.strftime(buf, sizeof(buf), pFormat);
testOk(strcmp(buf, "%S.%05f") == 0, "'%s' => '%s'", pFormat, buf);