Introduction
Introduction Statistics Contact Development Disclaimer Help
tm2sec.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
tm2sec.c (1900B)
---
1 #include <u.h>
2 #include <libc.h>
3
4 #include "zoneinfo.h"
5
6 #define SEC2MIN 60L
7 #define SEC2HOUR (60L*SEC2MIN)
8 #define SEC2DAY (24L*SEC2HOUR)
9
10 /*
11 * days per month plus days/year
12 */
13 static int dmsize[] =
14 {
15 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
16 };
17 static int ldmsize[] =
18 {
19 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
20 };
21
22 /*
23 * return the days/month for the given year
24 */
25 static int *
26 yrsize(int y)
27 {
28 if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0))
29 return ldmsize;
30 else
31 return dmsize;
32 }
33
34 /*
35 * compute seconds since Jan 1 1970 GMT
36 * and convert to our timezone.
37 */
38 long
39 tm2sec(Tm *tm)
40 {
41 Tinfo ti0, ti1, *ti;
42 long secs;
43 int i, yday, year, *d2m;
44
45 secs = 0;
46
47 /*
48 * seconds per year
49 */
50 year = tm->year + 1900;
51 for(i = 1970; i < year; i++){
52 d2m = yrsize(i);
53 secs += d2m[0] * SEC2DAY;
54 }
55
56 /*
57 * if mday is set, use mon and mday to compute yday
58 */
59 if(tm->mday){
60 yday = 0;
61 d2m = yrsize(year);
62 for(i=0; i<tm->mon; i++)
63 yday += d2m[i+1];
64 yday += tm->mday-1;
65 }else{
66 yday = tm->yday;
67 }
68 secs += yday * SEC2DAY;
69
70 /*
71 * hours, minutes, seconds
72 */
73 secs += tm->hour * SEC2HOUR;
74 secs += tm->min * SEC2MIN;
75 secs += tm->sec;
76
77 /*
78 * Assume the local time zone if zone is not GMT
79 */
80 if(strcmp(tm->zone, "GMT") != 0) {
81 i = zonelookuptinfo(&ti0, secs);
82 ti = &ti0;
83 if (i != -1)
84 if (ti->tzoff!=0) {
85 /*
86 * to what local time period `secs' belongs?
87 */
88 if (ti->tzoff>0) {
89 /*
90 * east of GMT; check previous local tim…
91 */
92 if (ti->t+ti->tzoff > secs)
93 if (zonetinfo(&ti1, i-1)!=-1)
94 ti = &ti1;
95 } else
96 /*
97 * west of GMT; check next local time tr…
98 */
99 if (zonetinfo(&ti1, i+1))
100 if (ti1.t+ti->tzoff < secs)
101 ti = &ti1;
102 // fprint(2, "tt: %ld+%d %ld\n", (long)ti->t, ti-…
103 secs -= ti->tzoff;
104 }
105 }
106
107 if(secs < 0)
108 secs = 0;
109 return secs;
110 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.