home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
emacs-19.28-src.tgz
/
tar.out
/
fsf
/
emacs
/
unixlib
/
src
/
timeconvert.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-28
|
2KB
|
95 lines
#include "amiga.h"
#include "timeconvert.h"
#include <time.h>
#include <proto/timer.h>
int _gettime(struct timeval *tp)
{
struct tm *local;
time_t gmt;
GetSysTime(tp);
/* Correct for different epoch (78 vs 70) */
tp->tv_secs += 252460800;
#ifdef USE_LOCAL
/* correct for timezone */
local = gmtime(&tp->tv_secs);
local->tm_isdst = -1; /* We don't know about dst */
gmt = mktime(local);
if (gmt == -1)
{
errno = EINVAL;
return -1;
}
tp->tv_secs = gmt;
#endif
return 0;
}
#ifdef USE_LOCAL
/* System is storing local time */
void _gmt2amiga(time_t time, struct DateStamp *date)
{
struct tm *local, *gmt;
local = localtime(&time);
gmt = gmtime(&time);
date->ds_Tick = 50 * local->tm_sec;
date->ds_Minute = local->tm_min + local->tm_hour * 60;
/* Now calculate the day assuming we are in GMT */
date->ds_Days = (time - 252460800) / 86400;
/* And correct by comparing local with GMT */
if (local->tm_year < gmt->tm_year ||
local->tm_year == gmt->tm_year && local->tm_yday < gmt->tm_yday)
date->ds_Days--;
if (local->tm_year > gmt->tm_year ||
local->tm_year == gmt->tm_year && local->tm_yday > gmt->tm_yday)
date->ds_Days++;
}
time_t _amiga2gmt(struct DateStamp *date)
{
struct tm *local;
time_t secs;
secs = date->ds_Tick / 50 + date->ds_Minute * 60 + date->ds_Days * 86400 +
252460800;
local = gmtime(&secs);
local->tm_isdst = -1; /* We don't know about dst */
return mktime(local);
}
#else
/* System is storing GMT */
/* Leap seconds are not handled !! */
void _gmt2amiga(time_t time, struct DateStamp *date)
{
time_t time78, day_secs;
time78 = time - 252460800; /* Change Epoch */
date->ds_Days = time78 / 86400;
day_secs = time78 % 86400;
date->ds_Minute = day_secs / 60;
date->ds_Tick = 50 * (day_secs % 60);
}
time_t _amiga2gmt(struct DateStamp *date)
{
time_t secs;
secs = date->ds_Tick / 50 + date->ds_Minute * 60 + date->ds_Days * 86400 +
252460800;
return secs;
}
#endif