Blame


1 f35a0486 2008-07-09 devnull /*
2 f35a0486 2008-07-09 devnull * This routine converts time as follows.
3 f35a0486 2008-07-09 devnull * The epoch is 0000 Jan 1 1970 GMT.
4 f35a0486 2008-07-09 devnull * The argument time is in seconds since then.
5 f35a0486 2008-07-09 devnull * The localtime(t) entry returns a pointer to an array
6 f35a0486 2008-07-09 devnull * containing
7 f35a0486 2008-07-09 devnull *
8 f35a0486 2008-07-09 devnull * seconds (0-59)
9 f35a0486 2008-07-09 devnull * minutes (0-59)
10 f35a0486 2008-07-09 devnull * hours (0-23)
11 f35a0486 2008-07-09 devnull * day of month (1-31)
12 f35a0486 2008-07-09 devnull * month (0-11)
13 f35a0486 2008-07-09 devnull * year-1970
14 f35a0486 2008-07-09 devnull * weekday (0-6, Sun is 0)
15 f35a0486 2008-07-09 devnull * day of the year
16 f35a0486 2008-07-09 devnull * daylight savings flag
17 f35a0486 2008-07-09 devnull *
18 f35a0486 2008-07-09 devnull * The routine gets the daylight savings time from the environment.
19 f35a0486 2008-07-09 devnull *
20 f35a0486 2008-07-09 devnull * asctime(tvec))
21 f35a0486 2008-07-09 devnull * where tvec is produced by localtime
22 f35a0486 2008-07-09 devnull * returns a ptr to a character string
23 f35a0486 2008-07-09 devnull * that has the ascii time in the form
24 f35a0486 2008-07-09 devnull *
25 f35a0486 2008-07-09 devnull * \\
26 f35a0486 2008-07-09 devnull * Thu Jan 01 00:00:00 GMT 1970n0
27 f35a0486 2008-07-09 devnull * 012345678901234567890123456789
28 f35a0486 2008-07-09 devnull * 0 1 2
29 f35a0486 2008-07-09 devnull *
30 f35a0486 2008-07-09 devnull * ctime(t) just calls localtime, then asctime.
31 f35a0486 2008-07-09 devnull */
32 f35a0486 2008-07-09 devnull
33 fd04aace 2003-11-23 devnull #include <u.h>
34 fd04aace 2003-11-23 devnull #include <libc.h>
35 fd04aace 2003-11-23 devnull
36 f35a0486 2008-07-09 devnull #include "zoneinfo.h"
37 f35a0486 2008-07-09 devnull
38 f35a0486 2008-07-09 devnull static char dmsize[12] =
39 fd04aace 2003-11-23 devnull {
40 f35a0486 2008-07-09 devnull 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
41 f35a0486 2008-07-09 devnull };
42 fd04aace 2003-11-23 devnull
43 f35a0486 2008-07-09 devnull #define dysize ctimedysize
44 f35a0486 2008-07-09 devnull static int dysize(int);
45 f35a0486 2008-07-09 devnull static void ct_numb(char*, int);
46 f35a0486 2008-07-09 devnull
47 f35a0486 2008-07-09 devnull char*
48 f35a0486 2008-07-09 devnull ctime(long t)
49 f35a0486 2008-07-09 devnull {
50 f35a0486 2008-07-09 devnull return asctime(localtime(t));
51 fd04aace 2003-11-23 devnull }
52 fd04aace 2003-11-23 devnull
53 f35a0486 2008-07-09 devnull Tm*
54 f35a0486 2008-07-09 devnull localtime(long tim)
55 f35a0486 2008-07-09 devnull {
56 f35a0486 2008-07-09 devnull Tinfo ti;
57 f35a0486 2008-07-09 devnull Tm *ct;
58 f35a0486 2008-07-09 devnull
59 f35a0486 2008-07-09 devnull if (zonelookuptinfo(&ti, tim)!=-1) {
60 f35a0486 2008-07-09 devnull ct = gmtime(tim+ti.tzoff);
61 e6ed10f2 2020-01-07 crossd strncpy(ct->zone, ti.zone, sizeof ct->zone - 1);
62 f35a0486 2008-07-09 devnull ct->zone[sizeof ct->zone-1] = 0;
63 f35a0486 2008-07-09 devnull ct->tzoff = ti.tzoff;
64 f35a0486 2008-07-09 devnull return ct;
65 f35a0486 2008-07-09 devnull }
66 f35a0486 2008-07-09 devnull return gmtime(tim);
67 f35a0486 2008-07-09 devnull }
68 f35a0486 2008-07-09 devnull
69 f35a0486 2008-07-09 devnull Tm*
70 f35a0486 2008-07-09 devnull gmtime(long tim)
71 f35a0486 2008-07-09 devnull {
72 f35a0486 2008-07-09 devnull int d0, d1;
73 f35a0486 2008-07-09 devnull long hms, day;
74 f35a0486 2008-07-09 devnull static Tm xtime;
75 f35a0486 2008-07-09 devnull
76 f35a0486 2008-07-09 devnull /*
77 f35a0486 2008-07-09 devnull * break initial number into days
78 f35a0486 2008-07-09 devnull */
79 f35a0486 2008-07-09 devnull hms = tim % 86400L;
80 f35a0486 2008-07-09 devnull day = tim / 86400L;
81 f35a0486 2008-07-09 devnull if(hms < 0) {
82 f35a0486 2008-07-09 devnull hms += 86400L;
83 f35a0486 2008-07-09 devnull day -= 1;
84 f35a0486 2008-07-09 devnull }
85 f35a0486 2008-07-09 devnull
86 f35a0486 2008-07-09 devnull /*
87 f35a0486 2008-07-09 devnull * generate hours:minutes:seconds
88 f35a0486 2008-07-09 devnull */
89 f35a0486 2008-07-09 devnull xtime.sec = hms % 60;
90 f35a0486 2008-07-09 devnull d1 = hms / 60;
91 f35a0486 2008-07-09 devnull xtime.min = d1 % 60;
92 f35a0486 2008-07-09 devnull d1 /= 60;
93 f35a0486 2008-07-09 devnull xtime.hour = d1;
94 f35a0486 2008-07-09 devnull
95 f35a0486 2008-07-09 devnull /*
96 f35a0486 2008-07-09 devnull * day is the day number.
97 f35a0486 2008-07-09 devnull * generate day of the week.
98 f35a0486 2008-07-09 devnull * The addend is 4 mod 7 (1/1/1970 was Thursday)
99 f35a0486 2008-07-09 devnull */
100 f35a0486 2008-07-09 devnull
101 f35a0486 2008-07-09 devnull xtime.wday = (day + 7340036L) % 7;
102 f35a0486 2008-07-09 devnull
103 f35a0486 2008-07-09 devnull /*
104 f35a0486 2008-07-09 devnull * year number
105 f35a0486 2008-07-09 devnull */
106 f35a0486 2008-07-09 devnull if(day >= 0)
107 f35a0486 2008-07-09 devnull for(d1 = 1970; day >= dysize(d1); d1++)
108 f35a0486 2008-07-09 devnull day -= dysize(d1);
109 f35a0486 2008-07-09 devnull else
110 f35a0486 2008-07-09 devnull for (d1 = 1970; day < 0; d1--)
111 f35a0486 2008-07-09 devnull day += dysize(d1-1);
112 f35a0486 2008-07-09 devnull xtime.year = d1-1900;
113 f35a0486 2008-07-09 devnull xtime.yday = d0 = day;
114 f35a0486 2008-07-09 devnull
115 f35a0486 2008-07-09 devnull /*
116 f35a0486 2008-07-09 devnull * generate month
117 f35a0486 2008-07-09 devnull */
118 f35a0486 2008-07-09 devnull
119 f35a0486 2008-07-09 devnull if(dysize(d1) == 366)
120 f35a0486 2008-07-09 devnull dmsize[1] = 29;
121 f35a0486 2008-07-09 devnull for(d1 = 0; d0 >= dmsize[d1]; d1++)
122 f35a0486 2008-07-09 devnull d0 -= dmsize[d1];
123 f35a0486 2008-07-09 devnull dmsize[1] = 28;
124 f35a0486 2008-07-09 devnull xtime.mday = d0 + 1;
125 f35a0486 2008-07-09 devnull xtime.mon = d1;
126 f35a0486 2008-07-09 devnull strcpy(xtime.zone, "GMT");
127 f35a0486 2008-07-09 devnull return &xtime;
128 f35a0486 2008-07-09 devnull }
129 f35a0486 2008-07-09 devnull
130 fd04aace 2003-11-23 devnull char*
131 fd04aace 2003-11-23 devnull asctime(Tm *t)
132 fd04aace 2003-11-23 devnull {
133 fc567f47 2011-08-02 rsc const char *ncp;
134 fd04aace 2003-11-23 devnull static char cbuf[30];
135 fd04aace 2003-11-23 devnull
136 fd04aace 2003-11-23 devnull strcpy(cbuf, "Thu Jan 01 00:00:00 GMT 1970\n");
137 fd04aace 2003-11-23 devnull ncp = &"SunMonTueWedThuFriSat"[t->wday*3];
138 fd04aace 2003-11-23 devnull cbuf[0] = *ncp++;
139 fd04aace 2003-11-23 devnull cbuf[1] = *ncp++;
140 fd04aace 2003-11-23 devnull cbuf[2] = *ncp;
141 fd04aace 2003-11-23 devnull ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[t->mon*3];
142 fd04aace 2003-11-23 devnull cbuf[4] = *ncp++;
143 fd04aace 2003-11-23 devnull cbuf[5] = *ncp++;
144 fd04aace 2003-11-23 devnull cbuf[6] = *ncp;
145 fd04aace 2003-11-23 devnull ct_numb(cbuf+8, t->mday);
146 fd04aace 2003-11-23 devnull ct_numb(cbuf+11, t->hour+100);
147 fd04aace 2003-11-23 devnull ct_numb(cbuf+14, t->min+100);
148 fd04aace 2003-11-23 devnull ct_numb(cbuf+17, t->sec+100);
149 fd04aace 2003-11-23 devnull ncp = t->zone;
150 fd04aace 2003-11-23 devnull cbuf[20] = *ncp++;
151 fd04aace 2003-11-23 devnull cbuf[21] = *ncp++;
152 fd04aace 2003-11-23 devnull cbuf[22] = *ncp;
153 fd04aace 2003-11-23 devnull if(t->year >= 100) {
154 fd04aace 2003-11-23 devnull cbuf[24] = '2';
155 fd04aace 2003-11-23 devnull cbuf[25] = '0';
156 fd04aace 2003-11-23 devnull }
157 fd04aace 2003-11-23 devnull ct_numb(cbuf+26, t->year+100);
158 fd04aace 2003-11-23 devnull return cbuf;
159 fd04aace 2003-11-23 devnull }
160 fd04aace 2003-11-23 devnull
161 f35a0486 2008-07-09 devnull static
162 f35a0486 2008-07-09 devnull int
163 f35a0486 2008-07-09 devnull dysize(int y)
164 fd04aace 2003-11-23 devnull {
165 f35a0486 2008-07-09 devnull
166 f35a0486 2008-07-09 devnull if(y%4 == 0 && (y%100 != 0 || y%400 == 0))
167 f35a0486 2008-07-09 devnull return 366;
168 f35a0486 2008-07-09 devnull return 365;
169 fd04aace 2003-11-23 devnull }
170 fd04aace 2003-11-23 devnull
171 f35a0486 2008-07-09 devnull static
172 f35a0486 2008-07-09 devnull void
173 f35a0486 2008-07-09 devnull ct_numb(char *cp, int n)
174 f35a0486 2008-07-09 devnull {
175 f35a0486 2008-07-09 devnull
176 f35a0486 2008-07-09 devnull cp[0] = ' ';
177 f35a0486 2008-07-09 devnull if(n >= 10)
178 f35a0486 2008-07-09 devnull cp[0] = (n/10)%10 + '0';
179 f35a0486 2008-07-09 devnull cp[1] = n%10 + '0';
180 f35a0486 2008-07-09 devnull }