Import BSDDB 4.7.25 (as of svn r89086)
This commit is contained in:
78
os_brew/localtime.c
Normal file
78
os_brew/localtime.c
Normal file
@@ -0,0 +1,78 @@
|
||||
/*-
|
||||
* See the file LICENSE for redistribution information.
|
||||
*
|
||||
* Copyright (c) 2006,2008 Oracle. All rights reserved.
|
||||
*
|
||||
* $Id: localtime.c 63573 2008-05-23 21:43:21Z trent.nelson $
|
||||
*/
|
||||
|
||||
#include "db_config.h"
|
||||
|
||||
#include "db_int.h"
|
||||
|
||||
/*
|
||||
* localtime --
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_LOCALTIME
|
||||
* PUBLIC: struct tm *localtime __P((const time_t *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
struct tm *
|
||||
localtime(tod)
|
||||
const time_t *tod;
|
||||
{
|
||||
JulianType jt;
|
||||
boolean is_ds; /* Daylight savings. */
|
||||
time_t tt;
|
||||
int increment;
|
||||
|
||||
/*
|
||||
* Berkeley DB uses POSIX time values internally, convert to a BREW
|
||||
* time value.
|
||||
*/
|
||||
is_ds = 0;
|
||||
tt = *tod - BREW_EPOCH_OFFSET + LOCALTIMEOFFSET(&is_ds);
|
||||
|
||||
GETJULIANDATE(tt, &jt);
|
||||
|
||||
DB_GLOBAL(ltm).tm_sec = jt.wSecond; /* seconds (0 - 60) */
|
||||
DB_GLOBAL(ltm).tm_min = jt.wMinute; /* minutes (0 - 59) */
|
||||
DB_GLOBAL(ltm).tm_hour = jt.wHour; /* hours (0 - 23) */
|
||||
DB_GLOBAL(ltm).tm_mday = jt.wDay; /* day of month (1 - 31) */
|
||||
DB_GLOBAL(ltm).tm_mon = jt.wMonth - 1; /* month of year (0 - 11) */
|
||||
/* year - 1900 */
|
||||
DB_GLOBAL(ltm).tm_year = jt.wYear - 1900;
|
||||
/* day of week (Sunday = 0) */
|
||||
DB_GLOBAL(ltm).tm_wday = (jt.wWeekDay + 1) % 7;
|
||||
/* day of year (0 - 365) */
|
||||
switch (DB_GLOBAL(ltm).tm_mon) {
|
||||
default:
|
||||
case 0: increment = 0; break;
|
||||
case 1: increment = 31; break;
|
||||
case 2: increment = 59; break; /* Feb = 28 */
|
||||
case 3: increment = 90; break;
|
||||
case 4: increment = 120; break;
|
||||
case 5: increment = 151; break;
|
||||
case 6: increment = 181; break;
|
||||
case 7: increment = 212; break;
|
||||
case 8: increment = 243; break;
|
||||
case 9: increment = 273; break;
|
||||
case 10: increment = 304; break;
|
||||
case 11: increment = 334; break;
|
||||
}
|
||||
DB_GLOBAL(ltm).tm_yday = increment + DB_GLOBAL(ltm).tm_mday - 1;
|
||||
|
||||
if (DB_GLOBAL(ltm).tm_mon > 1 && /* +1 leap years after Feb. */
|
||||
jt.wYear % 4 == 0 && (jt.wYear % 100 != 0 || jt.wYear % 400 == 0))
|
||||
DB_GLOBAL(ltm).tm_yday += 1;
|
||||
|
||||
DB_GLOBAL(ltm).tm_isdst = is_ds; /* daylight savings time */
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* This routine is not thread-safe. Berkeley DB should convert
|
||||
* to using localtime_r() where it's available, and this routine
|
||||
* should be re-written in the form of localtime_r().
|
||||
*/
|
||||
return (&DB_GLOBAL(ltm));
|
||||
}
|
||||
Reference in New Issue
Block a user