1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-14 10:09:48 +00:00

Implement time().

This commit is contained in:
Doug Rabson 2001-09-19 12:12:12 +00:00
parent a09c8e438b
commit 447a0851af
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=83666
2 changed files with 226 additions and 2 deletions

View File

@ -45,6 +45,9 @@ static const char rcsid[] =
#include <time.h>
#include <sys/time.h>
#include <stand.h>
#include "libski.h"
/*
// Accurate only for the past couple of centuries;
@ -57,9 +60,118 @@ static const char rcsid[] =
#define SECSPERHOUR ( 60*60 )
#define SECSPERDAY (24 * SECSPERHOUR)
struct ssc_time {
int Year;
int Month;
int Day;
int Hour;
int Minute;
int Second;
int Msec;
int Wday;
};
time_t
EfiTimeToUnixTime(struct ssc_time *ETime)
{
/*
// These arrays give the cumulative number of days up to the first of the
// month number used as the index (1 -> 12) for regular and leap years.
// The value at index 13 is for the whole year.
*/
static time_t CumulativeDays[2][14] = {
{0,
0,
31,
31 + 28,
31 + 28 + 31,
31 + 28 + 31 + 30,
31 + 28 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 },
{0,
0,
31,
31 + 29,
31 + 29 + 31,
31 + 29 + 31 + 30,
31 + 29 + 31 + 30 + 31,
31 + 29 + 31 + 30 + 31 + 30,
31 + 29 + 31 + 30 + 31 + 30 + 31,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }};
time_t UTime;
int Year;
ETime->Year += 1900;
/*
// Do a santity check
*/
if ( ETime->Year < 1998 || ETime->Year > 2099 ||
ETime->Month == 0 || ETime->Month > 12 ||
ETime->Day == 0 || ETime->Month > 31 ||
ETime->Hour > 23 ||
ETime->Minute > 59 ||
ETime->Second > 59 ) {
return (0);
}
/*
// Years
*/
UTime = 0;
for (Year = 1970; Year != ETime->Year; ++Year) {
UTime += (CumulativeDays[isleap(Year)][13] * SECSPERDAY);
}
/*
// UTime should now be set to 00:00:00 on Jan 1 of the file's year.
//
// Months
*/
UTime += (CumulativeDays[isleap(ETime->Year)][ETime->Month] * SECSPERDAY);
/*
// UTime should now be set to 00:00:00 on the first of the file's month and year
//
// Days -- Don't count the file's day
*/
UTime += (((ETime->Day > 0) ? ETime->Day-1:0) * SECSPERDAY);
/*
// Hours
*/
UTime += (ETime->Hour * SECSPERHOUR);
/*
// Minutes
*/
UTime += (ETime->Minute * 60);
/*
// Seconds
*/
UTime += ETime->Second;
return UTime;
}
time_t
time(time_t *tloc)
{
return 0; /* XXX */
struct ssc_time time;
ssc((u_int64_t) &time, 0, 0, 0, SSC_GET_RTC);
return *tloc = EfiTimeToUnixTime(&time);
}

View File

@ -45,6 +45,9 @@ static const char rcsid[] =
#include <time.h>
#include <sys/time.h>
#include <stand.h>
#include "libski.h"
/*
// Accurate only for the past couple of centuries;
@ -57,9 +60,118 @@ static const char rcsid[] =
#define SECSPERHOUR ( 60*60 )
#define SECSPERDAY (24 * SECSPERHOUR)
struct ssc_time {
int Year;
int Month;
int Day;
int Hour;
int Minute;
int Second;
int Msec;
int Wday;
};
time_t
EfiTimeToUnixTime(struct ssc_time *ETime)
{
/*
// These arrays give the cumulative number of days up to the first of the
// month number used as the index (1 -> 12) for regular and leap years.
// The value at index 13 is for the whole year.
*/
static time_t CumulativeDays[2][14] = {
{0,
0,
31,
31 + 28,
31 + 28 + 31,
31 + 28 + 31 + 30,
31 + 28 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 },
{0,
0,
31,
31 + 29,
31 + 29 + 31,
31 + 29 + 31 + 30,
31 + 29 + 31 + 30 + 31,
31 + 29 + 31 + 30 + 31 + 30,
31 + 29 + 31 + 30 + 31 + 30 + 31,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }};
time_t UTime;
int Year;
ETime->Year += 1900;
/*
// Do a santity check
*/
if ( ETime->Year < 1998 || ETime->Year > 2099 ||
ETime->Month == 0 || ETime->Month > 12 ||
ETime->Day == 0 || ETime->Month > 31 ||
ETime->Hour > 23 ||
ETime->Minute > 59 ||
ETime->Second > 59 ) {
return (0);
}
/*
// Years
*/
UTime = 0;
for (Year = 1970; Year != ETime->Year; ++Year) {
UTime += (CumulativeDays[isleap(Year)][13] * SECSPERDAY);
}
/*
// UTime should now be set to 00:00:00 on Jan 1 of the file's year.
//
// Months
*/
UTime += (CumulativeDays[isleap(ETime->Year)][ETime->Month] * SECSPERDAY);
/*
// UTime should now be set to 00:00:00 on the first of the file's month and year
//
// Days -- Don't count the file's day
*/
UTime += (((ETime->Day > 0) ? ETime->Day-1:0) * SECSPERDAY);
/*
// Hours
*/
UTime += (ETime->Hour * SECSPERHOUR);
/*
// Minutes
*/
UTime += (ETime->Minute * 60);
/*
// Seconds
*/
UTime += ETime->Second;
return UTime;
}
time_t
time(time_t *tloc)
{
return 0; /* XXX */
struct ssc_time time;
ssc((u_int64_t) &time, 0, 0, 0, SSC_GET_RTC);
return *tloc = EfiTimeToUnixTime(&time);
}