blob: dc9344a6d97b72bf19db5abc63c2a6c056998ea8 [file] [log] [blame]
wdenk012771d2002-03-08 21:31:05 +00001#ifndef _LINUX_TIME_H
2#define _LINUX_TIME_H
3
AKASHI Takahiro18723112019-11-13 09:44:50 +09004#include <rtc.h>
wdenk012771d2002-03-08 21:31:05 +00005#include <linux/types.h>
6
7#define _DEFUN(a,b,c) a(c)
8#define _CONST const
9#define _AND ,
10
11#define _REENT_ONLY
12
13#define SECSPERMIN 60L
14#define MINSPERHOUR 60L
15#define HOURSPERDAY 24L
16#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
17#define SECSPERDAY (SECSPERHOUR * HOURSPERDAY)
18#define DAYSPERWEEK 7
19#define MONSPERYEAR 12
20
21#define YEAR_BASE 1900
22#define EPOCH_YEAR 1970
23#define EPOCH_WDAY 4
24
25#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
26
27
28/* Used by other time functions. */
29struct tm {
30 int tm_sec; /* Seconds. [0-60] (1 leap second) */
31 int tm_min; /* Minutes. [0-59] */
32 int tm_hour; /* Hours. [0-23] */
33 int tm_mday; /* Day. [1-31] */
34 int tm_mon; /* Month. [0-11] */
35 int tm_year; /* Year - 1900. */
36 int tm_wday; /* Day of week. [0-6] */
37 int tm_yday; /* Days in year.[0-365] */
38 int tm_isdst; /* DST. [-1/0/1]*/
39
40# ifdef __USE_BSD
41 long int tm_gmtoff; /* Seconds east of UTC. */
42 __const char *tm_zone; /* Timezone abbreviation. */
43# else
44 long int __tm_gmtoff; /* Seconds east of UTC. */
45 __const char *__tm_zone; /* Timezone abbreviation. */
46# endif
47};
48
49static inline char *
50_DEFUN (asctime_r, (tim_p, result),
51 _CONST struct tm *tim_p _AND
52 char *result)
53{
54 static _CONST char day_name[7][3] = {
55 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
56 };
57 static _CONST char mon_name[12][3] = {
58 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
59 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
60 };
61
62 sprintf (result, "%.3s %.3s %.2d %.2d:%.2d:%.2d %d\n",
63 day_name[tim_p->tm_wday],
64 mon_name[tim_p->tm_mon],
65 tim_p->tm_mday, tim_p->tm_hour, tim_p->tm_min,
66 tim_p->tm_sec, 1900 + tim_p->tm_year);
67 return result;
68}
69
70static inline struct tm *
71_DEFUN (localtime_r, (tim_p, res),
72 _CONST time_t * tim_p _AND
73 struct tm *res)
74{
75 static _CONST int mon_lengths[2][MONSPERYEAR] = {
76 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
77 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
78 } ;
79
80 static _CONST int year_lengths[2] = {
81 365,
82 366
83 } ;
84
85 long days, rem;
86 int y;
87 int yleap;
88 _CONST int *ip;
89
90 days = ((long) *tim_p) / SECSPERDAY;
91 rem = ((long) *tim_p) % SECSPERDAY;
92 while (rem < 0)
93 {
94 rem += SECSPERDAY;
95 --days;
96 }
wdenk012771d2002-03-08 21:31:05 +000097
98 /* compute hour, min, and sec */
99 res->tm_hour = (int) (rem / SECSPERHOUR);
100 rem %= SECSPERHOUR;
101 res->tm_min = (int) (rem / SECSPERMIN);
102 res->tm_sec = (int) (rem % SECSPERMIN);
103
104 /* compute day of week */
105 if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0)
106 res->tm_wday += DAYSPERWEEK;
107
108 /* compute year & day of year */
109 y = EPOCH_YEAR;
110 if (days >= 0)
111 {
112 for (;;)
113 {
114 yleap = isleap(y);
115 if (days < year_lengths[yleap])
116 break;
117 y++;
118 days -= year_lengths[yleap];
119 }
120 }
121 else
122 {
123 do
124 {
125 --y;
126 yleap = isleap(y);
127 days += year_lengths[yleap];
128 } while (days < 0);
129 }
130
131 res->tm_year = y - YEAR_BASE;
132 res->tm_yday = days;
133 ip = mon_lengths[yleap];
134 for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon)
135 days -= ip[res->tm_mon];
136 res->tm_mday = days + 1;
137
138 /* set daylight saving time flag */
139 res->tm_isdst = -1;
140
141 return (res);
142}
143
144static inline char *
145_DEFUN (ctime_r, (tim_p, result),
146 _CONST time_t * tim_p _AND
147 char * result)
148
149{
150 struct tm tm;
151 return asctime_r (localtime_r (tim_p, &tm), result);
152}
153
AKASHI Takahiro18723112019-11-13 09:44:50 +0900154/* for compatibility with linux code */
155typedef __s64 time64_t;
156
157#ifdef CONFIG_LIB_DATE
158time64_t mktime64(const unsigned int year, const unsigned int mon,
159 const unsigned int day, const unsigned int hour,
160 const unsigned int min, const unsigned int sec);
161#endif
162
wdenk012771d2002-03-08 21:31:05 +0000163#endif