thank you. I admit that I tend to overlook the problems arising from portability to unusual machines. More source code comments would be useful, as such code is not obvious. On 07.08.13 16:27, Clive D.W. Feather wrote:
Alois Treindl said:
In localtime.c, function localsub() are these three lines of code:
1295 icycles = tcycles; 1296 if (tcycles - icycles >= 1 || icycles - tcycles >= 1) 1297 return NULL;
I do not understand the reason why lines 1296 and 1297 exist. icycles and tcycles are equal.
time_t just has to be an arithmetic type. This could include long long, double, long double, or even a complex type. Therefore it's possible that tcycles could contain a value that's not in the range of int_fast64_t (the type of icycles).
That code checks whether the value in tcycles is within the range of int_fast64_t. If it is, the conversion on line 1295 will either produce the same number or (if time_t is floating point) will round it off to the nearest integer. In that case, both halves of the test will be false.
But if the value in tcycles is out of range, the conversion will generate a completely different number, and so one of those tests will be true.