Files
m241Neelima/components/ip_net2-6.9/ipcom/port/src/ipcom_gmtime.c
T
2026-07-30 11:19:44 +05:30

287 lines
7.5 KiB
C

/*
******************************************************************************
* SOURCE FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipcom_gmtime.c,v $ $Revision: 1.9 $
* $Source: /home/interpeak/CVSRoot/ipcom/port/src/ipcom_gmtime.c,v $
* $Author: lob $ $Date: 2004-05-10 17:31:55 $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Lennart Bang <lob@interpeak.se>
******************************************************************************
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipcom_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#define IPCOM_USE_CLIB_PROTO
#include "ipcom_clib.h"
#include "ipcom_time.h"
/*
****************************************************************************
* 4 EXTERN PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 5 DEFINES
****************************************************************************
*/
#define SECS_IN_MIN 60
#define MINS_IN_HR 60
#define HRS_IN_DAY 24
#define DAYS_IN_NON_LEAP_YR 365
#define SECS_IN_HR (SECS_IN_MIN * MINS_IN_HR)
#define SECS_IN_DAY (SECS_IN_HR * HRS_IN_DAY)
#define SECS_IN_NON_LEAP_YR (SECS_IN_DAY * DAYS_IN_NON_LEAP_YR)
#define LEAP_YEAR(yr) ((((yr) & 0x3) == 0 && ((yr) % 100) != 0) || ((yr) % 400) == 0)
/*
****************************************************************************
* 6 TYPES
****************************************************************************
*/
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 8 DATA
****************************************************************************
*/
/*
****************************************************************************
* 9 LOCAL FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipcom_time_timetotm
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
#if (defined(IPCOM_GMTIME_R) && IPCOM_GMTIME_R == 1) || (defined(IPCOM_LOCALTIME_R) && IPCOM_LOCALTIME_R == 1)
IP_STATIC struct Ip_tm *
ipcom_time_timetotm(const Ip_time_t *timep, struct Ip_tm *tm)
{
Ip_u32 secs;
Ip_u32 days;
Ip_u32 years;
Ip_u32 months;
int inc_day = 0;
static const int days_in_month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
ip_assert(timep != IP_NULL);
/* Get days and seconds. */
secs = (Ip_u32)*timep;
days = secs / SECS_IN_DAY;
secs -= days * SECS_IN_DAY;
/* Set hours */
tm->tm_hour = (int)(secs / SECS_IN_HR);
secs -= tm->tm_hour * SECS_IN_HR;
/* Set minutes */
tm->tm_min = (int)secs / SECS_IN_MIN;
secs -= tm->tm_min * SECS_IN_MIN;
/* Set seconds */
tm->tm_sec = (int)secs;
/* Set week day */
tm->tm_wday = (int)((days + 4) % 7); /* + 4 since 1 Jan 1970 was a thursday. */
/* Set years */
for(years = 1970;; years++)
{
if(LEAP_YEAR(years))
{
if(days < 366)
break;
days -= 366;
}
else
{
if(days < 365)
break;
days -= 365;
}
}
tm->tm_year = (int)(years - 1900);
/* Set year days */
tm->tm_yday = (int)days;
/* Set months. */
if(LEAP_YEAR(years) && days > 58)
{
if(days == 59)
inc_day = 1;
days--; /* Adjust for leap year extra day in february. */
}
ip_assert(days <= 365);
for(months = 0;; months++)
{
if(days < (Ip_u32)days_in_month[months])
break;
days -= (Ip_u32)days_in_month[months];
}
tm->tm_mon = (int)months;
/* Set month day. */
tm->tm_mday = (int)(days + 1 + inc_day);
/*!! Not supported: Set daylight savings time flag. */
tm->tm_isdst = 0;
return tm;
}
#endif
/*
****************************************************************************
* 10 PUBLIC FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipcom_gmtime_r
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
#if defined(IPCOM_GMTIME_R) && IPCOM_GMTIME_R == 1
IP_PUBLIC struct Ip_tm *
ipcom_gmtime_r(const Ip_time_t *timep, struct Ip_tm *tm)
{
return ipcom_time_timetotm(timep, tm);
}
#endif
/*
*===========================================================================
* ipcom_gmtime
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
#if defined(IPCOM_GMTIME) && IPCOM_GMTIME == 1
IP_PUBLIC struct Ip_tm *
ipcom_gmtime(const Ip_time_t *timep)
{
static struct Ip_tm tm;
return ipcom_gmtime_r(timep, (struct Ip_tm *)&tm);
}
#endif
/*
*===========================================================================
* ipcom_tzset
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
#if defined(IPCOM_TZSET) && IPCOM_TZSET == 1
IP_PUBLIC void
ipcom_tzset(void)
{
}
#endif
/*
*===========================================================================
* ipcom_localtime_r
*===========================================================================
* Context:
* Description:
* Parameters:
* Returns:
*
*/
#if defined(IPCOM_LOCALTIME_R) && IPCOM_LOCALTIME_R == 1
IP_PUBLIC struct Ip_tm *
ipcom_localtime_r(const Ip_time_t *timep, struct Ip_tm *tm)
{
/*!!timezone*/
return ipcom_time_timetotm(timep, tm);
}
#endif
/*
*===========================================================================
* ipcom_localtime
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
#if defined(IPCOM_LOCALTIME) && IPCOM_LOCALTIME == 1
IP_PUBLIC struct Ip_tm *
ipcom_localtime(const Ip_time_t *timep)
{
static struct Ip_tm tm;
/*!!timezone*/
return ipcom_localtime_r(timep, (struct Ip_tm *)&tm);
}
#endif
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/