2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
7 * Copyright (c) 1980 Regents of the University of California.
8 * All rights reserved. The Berkeley software License Agreement
9 * specifies the terms and conditions for redistribution.
13 * This localtime is a modified version of offtime from libc, which does not
14 * bother to figure out the time zone from the kernel, from environment
15 * variables, or from Unix files.
18 #include <sys/types.h>
19 #include <sys/salib.h>
23 static int mon_lengths
[2][MONS_PER_YEAR
] = {
24 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
25 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
28 static int year_lengths
[2] = {
29 DAYS_PER_NYEAR
, DAYS_PER_LYEAR
33 localtime(const time_t *clock
)
44 days
= *clock
/ SECS_PER_DAY
;
45 rem
= *clock
% SECS_PER_DAY
;
50 while (rem
>= SECS_PER_DAY
) {
54 tmp
->tm_hour
= (int)(rem
/ SECS_PER_HOUR
);
55 rem
= rem
% SECS_PER_HOUR
;
56 tmp
->tm_min
= (int)(rem
/ SECS_PER_MIN
);
57 tmp
->tm_sec
= (int)(rem
% SECS_PER_MIN
);
58 tmp
->tm_wday
= (int)((EPOCH_WDAY
+ days
) % DAYS_PER_WEEK
);
60 tmp
->tm_wday
+= DAYS_PER_WEEK
;
65 if (days
< (long)year_lengths
[yleap
])
71 days
= days
- (long)year_lengths
[yleap
];
80 days
= days
+ (long)year_lengths
[yleap
];
83 tmp
->tm_year
= y
- TM_YEAR_BASE
;
84 tmp
->tm_yday
= (int)days
;
85 ip
= mon_lengths
[yleap
];
86 for (tmp
->tm_mon
= 0; days
>= (long)ip
[tmp
->tm_mon
]; ++(tmp
->tm_mon
))
87 days
= days
- (long)ip
[tmp
->tm_mon
];
88 tmp
->tm_mday
= (int)(days
+ 1);
99 * This routine converts time as follows.
100 * The epoch is 0000 Jan 1 1970 GMT.
101 * The argument time is in seconds since then.
102 * The localtime(t) entry returns a pointer to an array
107 * day of month (1-31)
110 * weekday (0-6, Sun is 0)
112 * daylight savings flag
114 * The routine corrects for daylight saving
115 * time and will work in any time zone provided
116 * "timezone" is adjusted to the difference between
117 * Greenwich and local standard time (measured in seconds).
118 * In places like Michigan "daylight" must
119 * be initialized to 0 to prevent the conversion
121 * There is a table which accounts for the peculiarities
122 * undergone by daylight time in 1974-1975.
124 * The routine does not work
125 * in Saudi Arabia which runs on Solar time.
128 * where tvec is produced by localtime
129 * returns a ptr to a character string
130 * that has the ascii time in the form
131 * Thu Jan 01 00:00:00 1970\n\0
132 * 01234567890123456789012345
135 * ctime(t) just calls localtime, then asctime.
137 * tzset() looks for an environment variable named
139 * If the variable is present, it will set the external
140 * variables "timezone", "altzone", "daylight", and "tzname"
141 * appropriately. It is called by localtime, and
142 * may also be called explicitly by the user.
147 #define dysize(A) (((A)%4)? 365: 366)
150 static char *ct_numb();
153 * POSIX.1c standard version of the function asctime_r.
154 * User gets it via static asctime_r from the header file.
157 __posix_asctime_r(const struct tm
*t
, char *cbuf
)
159 const char *Date
= "Day Mon 00 00:00:00 1900\n";
160 const char *Day
= "SunMonTueWedThuFriSat";
161 const char *Month
= "JanFebMarAprMayJunJulAugSepOctNovDec";
170 for (ncp
= Date
; *cp
++ = *ncp
++; /* */)
172 ncp
= Day
+ (3*t
->tm_wday
);
179 ncp
= Month
+ ((*tp
) * 3);
183 cp
= ct_numb(cp
, *--tp
);
184 cp
= ct_numb(cp
, *--tp
+100);
185 cp
= ct_numb(cp
, *--tp
+100);
186 cp
= ct_numb(cp
, *--tp
+100);
187 if (t
->tm_year
> 9999) {
191 uint_t hun
= 19 + (t
->tm_year
/ 100);
192 cp
[1] = (hun
/ 10) + '0';
193 cp
[2] = (hun
% 10) + '0';
196 cp
= ct_numb(cp
, t
->tm_year
+100);
201 * POSIX.1c Draft-6 version of the function asctime_r.
202 * It was implemented by Solaris 2.3.
205 asctime_r(const struct tm
*t
, char *cbuf
, int buflen
)
207 if (buflen
< CBUFSIZ
) {
211 return (__posix_asctime_r(t
, cbuf
));
215 ctime(const time_t *t
)
217 return (asctime(localtime(t
)));
222 asctime(const struct tm
*t
)
224 static char cbuf
[CBUFSIZ
];
226 return (asctime_r(t
, cbuf
, CBUFSIZ
));
231 ct_numb(char *cp
, int n
)
235 *cp
++ = (n
/10)%10 + '0';
237 *cp
++ = ' '; /* Pad with blanks */