Mercurial > libpst
diff src/timeconv.c @ 182:b65e8d0a088a
more cleanup on external names in the shared object file
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Mon, 13 Apr 2009 11:39:33 -0700 |
parents | 6954d315aaa8 |
children | 7c60d6d1c681 |
line wrap: on
line diff
--- a/src/timeconv.c Fri Apr 10 13:10:14 2009 -0700 +++ b/src/timeconv.c Mon Apr 13 11:39:33 2009 -0700 @@ -1,126 +1,32 @@ -/*********************************************************************** - * - * Borrowed from WINE sources!! (http://www.winehq.com) - * Converts a Win32 FILETIME structure to a UNIX time_t value - */ - -/*** WARNING **** - * This file is not to be included in a Visual C++ Project - * It will make the whole project fail to compile - * There are functions in libpst.c to handle the dates - * Do not use this one - */ - -#ifndef _WIN32 - #include "define.h" -char * pst_fileTimeToAscii (const FILETIME *filetime) { - time_t t1; + - t1 = pst_fileTimeToUnixTime(filetime, NULL); - return ctime(&t1); +char * pst_fileTimeToAscii(const FILETIME* filetime) { + time_t t; + t = pst_fileTimeToUnixTime(filetime); + return ctime(&t); } + struct tm * pst_fileTimeToStructTM (const FILETIME *filetime) { time_t t1; - t1 = pst_fileTimeToUnixTime(filetime, NULL); + t1 = pst_fileTimeToUnixTime(filetime); return gmtime(&t1); } -/*********************************************************************** - * DOSFS_FileTimeToUnixTime - * - * Convert a FILETIME format to Unix time. - * If not NULL, 'remainder' contains the fractional part of the filetime, - * in the range of [0..9999999] (even if time_t is negative). - */ -time_t pst_fileTimeToUnixTime( const FILETIME *filetime, DWORD *remainder ) + +time_t pst_fileTimeToUnixTime(const FILETIME *filetime) { - /* Read the comment in the function DOSFS_UnixTimeToFileTime. */ -#if USE_LONG_LONG - - long long int t = filetime->dwHighDateTime; + int64_t t = filetime->dwHighDateTime; t <<= 32; - t += (UINT32)filetime->dwLowDateTime; + t += filetime->dwLowDateTime; t -= 116444736000000000LL; - if (t < 0) - { - if (remainder) *remainder = 9999999 - (-t - 1) % 10000000; - return -1 - ((-t - 1) / 10000000); - } - else - { - if (remainder) *remainder = t % 10000000; - return t / 10000000; + if (t < 0) { + return -1 - ((-t - 1) / 10000000); } - -#else /* ISO version */ - - UINT32 a0; /* 16 bit, low bits */ - UINT32 a1; /* 16 bit, medium bits */ - UINT32 a2; /* 32 bit, high bits */ - UINT32 r; /* remainder of division */ - unsigned int carry; /* carry bit for subtraction */ - int negative; /* whether a represents a negative value */ - - /* Copy the time values to a2/a1/a0 */ - a2 = (UINT32)filetime->dwHighDateTime; - a1 = ((UINT32)filetime->dwLowDateTime ) >> 16; - a0 = ((UINT32)filetime->dwLowDateTime ) & 0xffff; - - /* Subtract the time difference */ - if (a0 >= 32768 ) a0 -= 32768 , carry = 0; - else a0 += (1 << 16) - 32768 , carry = 1; - - if (a1 >= 54590 + carry) a1 -= 54590 + carry, carry = 0; - else a1 += (1 << 16) - 54590 - carry, carry = 1; - - a2 -= 27111902 + carry; - - /* If a is negative, replace a by (-1-a) */ - negative = (a2 >= ((UINT32)1) << 31); - if (negative) - { - /* Set a to -a - 1 (a is a2/a1/a0) */ - a0 = 0xffff - a0; - a1 = 0xffff - a1; - a2 = ~a2; + else { + return t / 10000000; } - - /* Divide a by 10000000 (a = a2/a1/a0), put the rest into r. - Split the divisor into 10000 * 1000 which are both less than 0xffff. */ - a1 += (a2 % 10000) << 16; - a2 /= 10000; - a0 += (a1 % 10000) << 16; - a1 /= 10000; - r = a0 % 10000; - a0 /= 10000; - - a1 += (a2 % 1000) << 16; - a2 /= 1000; - a0 += (a1 % 1000) << 16; - a1 /= 1000; - r += (a0 % 1000) * 10000; - a0 /= 1000; - - /* If a was negative, replace a by (-1-a) and r by (9999999 - r) */ - if (negative) - { - /* Set a to -a - 1 (a is a2/a1/a0) */ - a0 = 0xffff - a0; - a1 = 0xffff - a1; - a2 = ~a2; - - r = 9999999 - r; - } - - if (remainder) *remainder = r; - - /* Do not replace this by << 32, it gives a compiler warning and it does - not work. */ - return ((((time_t)a2) << 16) << 16) + (a1 << 16) + a0; -#endif } -#endif /* !_WIN32 */