mirror of
https://github.com/neovim/neovim.git
synced 2025-10-02 16:08:36 +00:00
Remove long_u: Passing-by: put_time(): Refactor implementation.
put_time() had a complicated implementation, because of having to shift an 8-byte value in a portable way with old means. That can be greatly simplified now, using a C99 fixed-size type.
This commit is contained in:
@@ -511,34 +511,12 @@ int put_bytes(FILE *fd, uintmax_t number, unsigned int len)
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Write time_t to file "fd" in 8 bytes.
|
||||
*/
|
||||
void put_time(FILE *fd, time_t the_time)
|
||||
/// Write time_t to file "fd" in 8 bytes.
|
||||
void put_time(FILE *fd, time_t time_)
|
||||
{
|
||||
int c;
|
||||
int i;
|
||||
time_t wtime = the_time;
|
||||
|
||||
/* time_t can be up to 8 bytes in size, more than long_u, thus we
|
||||
* can't use put_bytes() here.
|
||||
* Another problem is that ">>" may do an arithmetic shift that keeps the
|
||||
* sign. This happens for large values of wtime. A cast to long_u may
|
||||
* truncate if time_t is 8 bytes. So only use a cast when it is 4 bytes,
|
||||
* it's safe to assume that long_u is 4 bytes or more and when using 8
|
||||
* bytes the top bit won't be set. */
|
||||
for (i = 7; i >= 0; --i) {
|
||||
if (i + 1 > (int)sizeof(time_t))
|
||||
/* ">>" doesn't work well when shifting more bits than avail */
|
||||
putc(0, fd);
|
||||
else {
|
||||
#if defined(SIZEOF_TIME_T) && SIZEOF_TIME_T > 4
|
||||
c = (int)(wtime >> (i * 8));
|
||||
#else
|
||||
c = (int)((long_u)wtime >> (i * 8));
|
||||
#endif
|
||||
putc(c, fd);
|
||||
}
|
||||
// time_t can be up to 8 bytes in size, more than uintmax_t in 32 bits
|
||||
// systems, thus we can't use put_bytes() here.
|
||||
for (unsigned int i = 7; i < 8; --i) {
|
||||
putc((int)((uint64_t)time_ >> (i * 8)), fd);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user