mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-14 10:09:48 +00:00
Implement time().
This commit is contained in:
parent
a09c8e438b
commit
447a0851af
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=83666
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user