Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/dreamcast/localtime.c
2 views
1
/*
2
* localtime_r.c
3
* Original Author: Adapted from tzcode maintained by Arthur David Olson.
4
*
5
* Converts the calendar time pointed to by tim_p into a broken-down time
6
* expressed as local time. Returns a pointer to a structure containing the
7
* broken-down time.
8
*/
9
10
/* This file was taken from newlib <http://sourceware.org/newlib>, it's a
11
* modified version of Arthur David Olsons localtime.c from tzcode which
12
* is under Public Domain */
13
14
#include <stdlib.h>
15
#include <time.h>
16
#include "localtime.h"
17
18
#define SECSPERMIN 60L
19
#define MINSPERHOUR 60L
20
#define HOURSPERDAY 24L
21
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
22
#define SECSPERDAY (SECSPERHOUR * HOURSPERDAY)
23
#define DAYSPERWEEK 7
24
#define MONSPERYEAR 12
25
26
#define YEAR_BASE 1900
27
#define EPOCH_YEAR 1970
28
#define EPOCH_WDAY 4
29
30
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
31
32
static const int mon_lengths[2][MONSPERYEAR] = {
33
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
34
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
35
} ;
36
37
static const int year_lengths[2] = {
38
365,
39
366
40
} ;
41
42
struct tm * internal_localtime_r(const time_t * tim_p, struct tm *res)
43
{
44
long days, rem;
45
int y;
46
int yleap;
47
const int *ip;
48
49
days = ((long) *tim_p) / SECSPERDAY;
50
rem = ((long) *tim_p) % SECSPERDAY;
51
while (rem < 0)
52
{
53
rem += SECSPERDAY;
54
--days;
55
}
56
while (rem >= SECSPERDAY)
57
{
58
rem -= SECSPERDAY;
59
++days;
60
}
61
62
/* compute hour, min, and sec */
63
res->tm_hour = (int) (rem / SECSPERHOUR);
64
rem %= SECSPERHOUR;
65
res->tm_min = (int) (rem / SECSPERMIN);
66
res->tm_sec = (int) (rem % SECSPERMIN);
67
68
/* compute day of week */
69
if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0)
70
res->tm_wday += DAYSPERWEEK;
71
72
/* compute year & day of year */
73
y = EPOCH_YEAR;
74
if (days >= 0)
75
{
76
for (;;)
77
{
78
yleap = isleap(y);
79
if (days < year_lengths[yleap])
80
break;
81
y++;
82
days -= year_lengths[yleap];
83
}
84
}
85
else
86
{
87
do
88
{
89
--y;
90
yleap = isleap(y);
91
days += year_lengths[yleap];
92
} while (days < 0);
93
}
94
95
res->tm_year = y - YEAR_BASE;
96
res->tm_yday = days;
97
ip = mon_lengths[yleap];
98
for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon)
99
days -= ip[res->tm_mon];
100
res->tm_mday = days + 1;
101
102
/* set daylight saving time flag */
103
res->tm_isdst = -1;
104
105
return (res);
106
}
107
108