windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/datestuf.c
2020-09-26 16:20:57 +08:00

248 lines
6.4 KiB
C

/*===========================================================================*/
/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */
/* Houston, Texas */
/*===========================================================================*/
#include "winrev.h"
#include <windows.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include <io.h> /* added for get_osfhandle crt -sdj*/
static INT dayTable[2][13] =
{
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
/*-------------- >>> Routines Specific to Windows Start Here <<< ------------*/
/*---------------------------------------------------------------------------*/
/* getDateTime() - Set a long int to number of elapsed seconds since [scf] */
/* January 1, 1904. (Mimic the MAC funtion) */
/*---------------------------------------------------------------------------*/
VOID getDateTime (LONG *elapsedSecs)
{
DOSTIME present;
readDateTime (&present);
date2secs (&present, elapsedSecs);
}
/*---------------------------------------------------------------------------*/
/* date2secs() - Convert a date found in DOSTIME struct to elapsed seconds */
/* since January 1, 1904. (Mimic the MAC) [scf] */
/*---------------------------------------------------------------------------*/
VOID date2secs (DOSTIME *date, LONG *elapsedSecs)
{
#ifdef ORGCODE
INT year;
INT month;
INT leapYear;
#else
WORD year;
WORD month;
WORD leapYear;
#endif
*elapsedSecs = 0l;
for (year = 1904; year < date->yy; year++)
{
leapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
for (month = 1; month <= 12; month++)
*elapsedSecs += (LONG) dayTable[leapYear][month] * SECS_IN_A_DAY;
}
leapYear = date->yy % 4 == 0 && date->yy % 100 != 0 || date->yy % 400 == 0;
for (month = 1; month < date->mm; month++)
*elapsedSecs += (LONG) dayTable[leapYear][month] * SECS_IN_A_DAY;
*elapsedSecs += (LONG) (date->dd-1) *SECS_IN_A_DAY;
*elapsedSecs += (LONG) date->hour *60*60;
*elapsedSecs += (LONG) date->minute * 60;
*elapsedSecs += (LONG) date->second;
}
/*---------------------------------------------------------------------------*/
/* secs2date() - Sets DOSTIME struct (except dayOfWeek) according to the */
/* number of elapsed seconds since January 1, 1904. [scf] */
/*---------------------------------------------------------------------------*/
VOID secs2date (LONG secs, DOSTIME *date)
{
register INT year;
INT month;
INT day;
INT hour;
INT minute;
INT leapYear;
INT daysPerYear[2];
DWORD usecs;
daysPerYear[0] = DAYS_IN_A_YEAR;
daysPerYear[1] = DAYS_IN_A_YEAR + (leapYear = 1);
usecs = (DWORD) secs;
year = 1904;
while (usecs >= (DWORD) daysPerYear[leapYear] * SECS_IN_A_DAY)
{
usecs -= (DWORD) daysPerYear[leapYear] * SECS_IN_A_DAY;
year++;
leapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 1 : 0;
}
secs = (LONG) usecs;
for (month = 1; secs >= (LONG) dayTable[leapYear][month] *SECS_IN_A_DAY;
month++)
secs -= (LONG) dayTable[leapYear][month] *SECS_IN_A_DAY;
for (day = 1; secs >= SECS_IN_A_DAY; day++)
secs -= SECS_IN_A_DAY;
for (hour = 0; secs >= 60*60; hour++)
secs -= 60 * 60;
for (minute = 0; secs >= 60; minute++)
secs -= 60;
date->yy = (WORD)year;
date->mm = (WORD)month;
date->dd = (WORD)day;
date->dayOfWeek = DONTCARE;
date->hour = (WORD)hour;
date->minute = (WORD)minute;
date->second = (INT) secs;
}
VOID readDateTime(DOSTIME *pDosTime)
{
SYSTEMTIME NtSystemTime;
/************
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
***************/
/********************
typedef
struct {
WORD hour;
WORD minute;
WORD second;
WORD dayOfWeek;
WORD mm;
WORD dd;
WORD yy;
} DOSTIME;
*************************/
DEBOUT("readDateTime:%s\n","Calling GetSystemTime()");
// GetSystemTime(&NtSystemTime);
// -sdj this time will not make sense, have to use
// -sdj GetLocalTime instead, this is due to Zone,Bias,UTC and all
// -sdj the other complicated things I have to learn sometime!
GetLocalTime(&NtSystemTime);
pDosTime->hour = NtSystemTime.wHour;
pDosTime->minute = NtSystemTime.wMinute;
pDosTime->second = NtSystemTime.wSecond;
pDosTime->dayOfWeek = NtSystemTime.wDayOfWeek;
pDosTime->mm = NtSystemTime.wMonth;
pDosTime->dd = NtSystemTime.wDay;
pDosTime->yy = NtSystemTime.wYear;
}
VOID getFileDate(DOSTIME *pDosTime, int fh)
{
//BOOL bRc;
//HANDLE hFile;
//FILETIME CrTime,AccTime,WrTime;
SYSTEMTIME SysTime;
DEBOUT("getFileDate: UNDEF!! %s\n","converting the crt fh to os fh using get_osfhandle");
/* hFile = get_osfhandle(fh); */
DEBOUT("getFileDate: UNDEF!! got os fh as %lx\n", hFile);
/* DEBOUT("getFileDate: %s\n","calling GetFileTime , for LastWrTime"); */
/* bRc = GetFileTime(hFile,&CrTime,&AccTime,&WrTime); */
/* DEBOUT("getFileDate: GetFileTime Rc= %lx\n conv to SystemTime",bRc); */
/* bRc = FileTimeToSystemTime(&WrTime,&SysTime); */
/* DEBOUT("getFileDate: FileTimeToSystemTime Rc= %lx\n store in DosTime",bRc); */
DEBOUT("getFileDate: HACK %s\n","calling sys time instead of filetime for now");
GetSystemTime(&SysTime);
pDosTime->hour = SysTime.wHour;
pDosTime->minute = SysTime.wMinute;
pDosTime->second = SysTime.wSecond;
pDosTime->dayOfWeek = SysTime.wDayOfWeek;
pDosTime->mm = SysTime.wMonth;
pDosTime->dd = SysTime.wDay;
pDosTime->yy = SysTime.wYear;
}
#ifdef OLDCODE
VOID lmovmem(LPSTR lpsrc,LPSTR lpdst, WORD wCount)
{
LPBYTE TmpSrc,TmpDst;
WORD i;
TmpSrc = (LPBYTE)lpsrc;
TmpDst = (LPBYTE)lpdst;
for (i=0; i< wCount; i++)
{
*TmpDst = *TmpSrc;
TmpDst++;TmpSrc++;
}
}
VOID lsetmem(LPSTR str,BYTE ch,WORD wCount)
{
WORD i;
LPSTR tmp;
tmp = str;
for (i=0; i < wCount; i++)
{
*tmp = ch;
tmp++;
}
}
#endif