bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
// Windows/Time.h
#ifndef __WINDOWS_TIME_H
#define __WINDOWS_TIME_H
#include "Common/Types.h"
#include "Windows/Defs.h"
namespace NWindows {
namespace NTime {
inline bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime)
{
return BOOLToBool(::DosDateTimeToFileTime(UInt16(dosTime >> 16),
UInt16(dosTime & 0xFFFF), &fileTime));
}
const UInt32 kHighDosTime = 0xFF9FBF7D;
const UInt32 kLowDosTime = 0x210000;
inline bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime)
{
WORD datePart, timePart;
if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart))
{
if (fileTime.dwHighDateTime >= 0x01C00000) // 2000
dosTime = kHighDosTime;
else
dosTime = kLowDosTime;
return false;
}
dosTime = (((UInt32)datePart) << 16) + timePart;
return true;
}
const UInt32 kNumTimeQuantumsInSecond = 10000000;
const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774;
inline void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime)
{
UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond;
fileTime.dwLowDateTime = (DWORD)v;
fileTime.dwHighDateTime = (DWORD)(v >> 32);
}
inline bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime)
{
UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;
if (winTime < kUnixTimeStartValue)
{
unixTime = 0;
return false;
}
winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond;
if (winTime > 0xFFFFFFFF)
{
unixTime = 0xFFFFFFFF;
return false;
}
unixTime = (UInt32)winTime;
return true;
}
}}
#endif