date.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
date.c (1961B) | |
--- | |
1 #include <u.h> | |
2 #include <stdlib.h> /* setenv etc. */ | |
3 #define NOPLAN9DEFINES | |
4 #include <libc.h> | |
5 #include <time.h> | |
6 | |
7 #define _HAVETIMEGM 1 | |
8 #define _HAVETMZONE 1 | |
9 #define _HAVETMTZOFF 1 | |
10 | |
11 #if defined(__linux__) | |
12 # undef _HAVETMZONE | |
13 # undef _HAVETMTZOFF | |
14 | |
15 #elif defined(__sun__) | |
16 # undef _HAVETIMEGM | |
17 # undef _HAVETMZONE | |
18 # undef _HAVETMTZOFF | |
19 | |
20 #endif | |
21 | |
22 static Tm bigtm; | |
23 | |
24 static void | |
25 tm2Tm(struct tm *tm, Tm *bigtm) | |
26 { | |
27 char *s; | |
28 | |
29 memset(bigtm, 0, sizeof *bigtm); | |
30 bigtm->sec = tm->tm_sec; | |
31 bigtm->min = tm->tm_min; | |
32 bigtm->hour = tm->tm_hour; | |
33 bigtm->mday = tm->tm_mday; | |
34 bigtm->mon = tm->tm_mon; | |
35 bigtm->year = tm->tm_year; | |
36 bigtm->wday = tm->tm_wday; | |
37 strftime(bigtm->zone, sizeof bigtm->zone, "%Z", tm); | |
38 #ifdef _HAVETZOFF | |
39 bigtm->tzoff = tm->tm_gmtoff; | |
40 #endif | |
41 | |
42 if(bigtm->zone[0] == 0){ | |
43 s = getenv("TIMEZONE"); | |
44 if(s){ | |
45 strecpy(bigtm->zone, bigtm->zone+4, s); | |
46 free(s); | |
47 } | |
48 } | |
49 } | |
50 | |
51 static void | |
52 Tm2tm(Tm *bigtm, struct tm *tm) | |
53 { | |
54 memset(tm, 0, sizeof *tm); | |
55 tm->tm_sec = bigtm->sec; | |
56 tm->tm_min = bigtm->min; | |
57 tm->tm_hour = bigtm->hour; | |
58 tm->tm_mday = bigtm->mday; | |
59 tm->tm_mon = bigtm->mon; | |
60 tm->tm_year = bigtm->year; | |
61 tm->tm_wday = bigtm->wday; | |
62 #ifdef _HAVETMZONE | |
63 tm->tm_zone = bigtm->zone; | |
64 #endif | |
65 #ifdef _HAVETZOFF | |
66 tm->tm_gmtoff = bigtm->tzoff; | |
67 #endif | |
68 } | |
69 | |
70 Tm* | |
71 p9gmtime(long x) | |
72 { | |
73 time_t t; | |
74 struct tm tm; | |
75 | |
76 t = (time_t)x; | |
77 tm = *gmtime(&t); | |
78 tm2Tm(&tm, &bigtm); | |
79 return &bigtm; | |
80 } | |
81 | |
82 Tm* | |
83 p9localtime(long x) | |
84 { | |
85 time_t t; | |
86 struct tm tm; | |
87 | |
88 t = (time_t)x; | |
89 tm = *localtime(&t); | |
90 tm2Tm(&tm, &bigtm); | |
91 return &bigtm; | |
92 } | |
93 | |
94 #if !defined(_HAVETIMEGM) | |
95 static time_t | |
96 timegm(struct tm *tm) | |
97 { | |
98 time_t ret; | |
99 char *tz; | |
100 char *s; | |
101 | |
102 tz = getenv("TZ"); | |
103 putenv("TZ="); | |
104 tzset(); | |
105 ret = mktime(tm); | |
106 if(tz){ | |
107 s = smprint("TZ=%s", tz); | |
108 if(s) | |
109 putenv(s); | |
110 } | |
111 return ret; | |
112 } | |
113 #endif | |
114 | |
115 long | |
116 p9tm2sec(Tm *bigtm) | |
117 { | |
118 struct tm tm; | |
119 | |
120 Tm2tm(bigtm, &tm); | |
121 if(strcmp(bigtm->zone, "GMT") == 0 || strcmp(bigtm->zone, "UCT")… | |
122 return timegm(&tm); | |
123 return mktime(&tm); /* local time zone */ | |
124 } | |
125 |