mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.3 KiB
90 lines
2.3 KiB
/********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1990-1991 **/
|
|
/********************************************************************/
|
|
/* :ts=4 */
|
|
|
|
/*** dostime.cpp - map between DOS & NET time formats
|
|
*/
|
|
|
|
#include "npcommon.h"
|
|
#include <convtime.h>
|
|
|
|
|
|
#define YR_MASK 0xFE00
|
|
#define LEAPYR_MASK 0x0600
|
|
#define YR_BITS 7
|
|
#define MON_MASK 0x01E0
|
|
#define MON_BITS 4
|
|
#define DAY_MASK 0x001F
|
|
#define DAY_BITS 5
|
|
|
|
#define HOUR_MASK 0xF800
|
|
#define HOUR_BITS 5
|
|
#define MIN_MASK 0x07E0
|
|
#define MIN_BITS 6
|
|
#define SEC2_MASK 0x001F
|
|
#define SEC2_BITS 5
|
|
|
|
void
|
|
NetToDosDate(
|
|
DWORD time,
|
|
dos_time *pinfo) // ptr for return data:
|
|
{
|
|
UINT secs, days;
|
|
WORD r;
|
|
|
|
time = (time - _70_to_80_bias) / 2; // # of 2 second periods since 1980
|
|
secs = time % SEC2S_IN_DAY; // 2 second period into day
|
|
days = time / SEC2S_IN_DAY; // days since Jan 1 1980
|
|
|
|
r = secs % 30; // # of 2 second steps
|
|
secs /= 30;
|
|
r |= (secs % 60) << SEC2_BITS; // # of minutes
|
|
r |= (secs / 60) << (SEC2_BITS+MIN_BITS); // # of hours
|
|
pinfo->dt_time = r;
|
|
|
|
r = days / FOURYEARS; // (r) = four year period past 1980
|
|
days %= FOURYEARS; // (days) = days into four year period
|
|
r *= 4; // (r) = years since 1980 (within 3)
|
|
|
|
if (days == 31+28) {
|
|
//* Special case for FEB 29th
|
|
r = (r<<(MON_BITS+DAY_BITS)) + (2<<DAY_BITS) + 29;
|
|
} else {
|
|
if (days > 31+28)
|
|
--days; // compensate for leap year
|
|
while (days >= 365) {
|
|
++r;
|
|
days -= 365;
|
|
}
|
|
|
|
for (secs = 1; days >= MonTotal[secs+1] ; ++secs)
|
|
;
|
|
days -= MonTotal[secs];
|
|
r <<= MON_BITS;
|
|
r += (unsigned short) secs;
|
|
r <<= DAY_BITS;
|
|
r += (unsigned short) days+1;
|
|
}
|
|
pinfo->dt_date = r;
|
|
}
|
|
|
|
|
|
DWORD
|
|
DosToNetDate(dos_time dt)
|
|
{
|
|
UINT days, secs2;
|
|
|
|
days = dt.dt_date >> (MON_BITS + DAY_BITS);
|
|
days = days*365 + days/4; // # of years in days
|
|
days += (dt.dt_date & DAY_MASK) + MonTotal[(dt.dt_date&MON_MASK) >> DAY_BITS];
|
|
if ((dt.dt_date&LEAPYR_MASK) == 0
|
|
&& (dt.dt_date&MON_MASK) <= (2<<DAY_BITS))
|
|
--days; // adjust days for early in leap year
|
|
|
|
secs2 = ( ((dt.dt_time&HOUR_MASK) >> (MIN_BITS+SEC2_BITS)) * 60
|
|
+ ((dt.dt_time&MIN_MASK) >> SEC2_BITS) ) * 30
|
|
+ (dt.dt_time&SEC2_MASK);
|
|
return (DWORD)days*SECS_IN_DAY + _70_to_80_bias + (DWORD)secs2*2;
|
|
}
|