📄 rvtimeutil.c
字号:
#if (0)************************************************************************Filename : Description:************************************************************************ Copyright (c) 2000 RADVision Inc. ************************************************************************NOTICE:This document contains information that is proprietary to RADVision LTD. No part of this publication may be reproduced in any form whatsoever without written prior approval by RADVision LTD.. RADVision LTD. reserves the right to revise this publication and make changes without obligation to notify any person of such revisions or changes. ************************************************************************ $Revision:$ $Date:$ $Author: Jay Davis$ ************************************************************************#endif/* Parts based on the following public domain software: *//* $FreeBSD: src/lib/libc/stdtime/asctime.c,v 1.8 2001/01/24 13:01:02 deischen Exp $ *//* $FreeBSD: src/lib/libc/stdtime/localtime.c,v 1.27 2001/02/15 22:17:04 tegge Exp $ *//* June 5, 1996 by Arthur David Olson (arthur_david_olson@nih.gov). *//* This file contains primitive versions of gmtime_r and localtime_r (asctime_r *//* is generic). These are for embedded OS's (ie Nucleus) that don't have *//* these standard reentrant functions. Things like leap-seconds are not *//* accounted for and no timezone work is done (localtime = gmtime). *//* Eventually a full set of time functions should be included to handle *//* it all properly for each OS. */#include <stdio.h>#include "rvtimeutil.h"#define SECSPERMIN 60#define MINSPERHOUR 60#define HOURSPERDAY 24#define DAYSPERWEEK 7#define DAYSPERNYEAR 365#define DAYSPERLYEAR 366#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)#define MONSPERYEAR 12#define TM_SUNDAY 0#define TM_MONDAY 1#define TM_TUESDAY 2#define TM_WEDNESDAY 3#define TM_THURSDAY 4#define TM_FRIDAY 5#define TM_SATURDAY 6#define TM_JANUARY 0#define TM_FEBRUARY 1#define TM_MARCH 2#define TM_APRIL 3#define TM_MAY 4#define TM_JUNE 5#define TM_JULY 6#define TM_AUGUST 7#define TM_SEPTEMBER 8#define TM_OCTOBER 9#define TM_NOVEMBER 10#define TM_DECEMBER 11#define TM_YEAR_BASE 1900#define EPOCH_YEAR 1970#define EPOCH_WDAY TM_THURSDAY/*** Accurate only for the past couple of centuries;** that will probably do.*/#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))/* Only use for Nucleus, other OS's have their own libs */#if defined(RV_OS_NUCLEUS)static const int mon_lengths[2][MONSPERYEAR] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }};static const int year_lengths[2] = { DAYSPERNYEAR, DAYSPERLYEAR};/*** A la X3J11, with core dump avoidance.*//* result must be at least 26 characters long */char *rvAsctime_r(const RvTm *timeptr, char *result){ static const char wday_name[][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static const char mon_name[][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; const char *wn; const char *mn; int mday, hour, min, sec, year; if((timeptr->tm_wday < 0) || (timeptr->tm_wday >= DAYSPERWEEK)) { wn = "???"; } else wn = wday_name[timeptr->tm_wday]; if((timeptr->tm_mon < 0) || (timeptr->tm_mon >= MONSPERYEAR)) { mn = "???"; } else mn = mon_name[timeptr->tm_mon]; year = TM_YEAR_BASE + timeptr->tm_year; mday = timeptr->tm_mday; hour = timeptr->tm_hour; min = timeptr->tm_min; sec = timeptr->tm_sec; /* Add checks to prevent overruns */ if((timeptr->tm_mday < 0) || (timeptr->tm_mday > 99)) mday = 0; if((timeptr->tm_hour < 0) || (timeptr->tm_hour > 99)) hour = 0; if((timeptr->tm_min < 0) || (timeptr->tm_min > 99)) min = 0; if((timeptr->tm_sec < 0) || (timeptr->tm_sec > 99)) sec = 0; if((year < 0) || (year > 9999)) year = 0; /* ** The X3J11-suggested format is ** "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %d\n" ** Since the .2 in 02.2d is ignored, we drop it. */ sprintf(result, "%.3s %.3s%3d %02d:%02d:%02d %d\n", wn, mn, mday, hour, min, sec, year); return result;}/* Does not account for leap seconds or anything fancy. IEEE spec *//* even forgot about leap seconds. So we do things the simple way *//* for now */RvTm *rvGmtime_r(RvTime t, RvTm *tm){ int year, month, days, leapyear; RvTime temp; temp = t; tm->tm_sec = temp % SECSPERMIN; temp = temp/SECSPERMIN; tm->tm_min = temp % MINSPERHOUR; temp = temp/MINSPERHOUR; tm->tm_hour = temp % HOURSPERDAY; temp = temp / HOURSPERDAY; tm->tm_wday = (temp + EPOCH_WDAY) % DAYSPERWEEK; year = EPOCH_YEAR; for(;;) { leapyear = isleap(year); days = year_lengths[leapyear]; if(temp < days) break; temp -= days; year++; } tm->tm_year = year - TM_YEAR_BASE; tm->tm_yday = temp; month = TM_JANUARY; for(;;) { days = mon_lengths[leapyear][month]; if(temp < days) break; temp -= days; month++; } tm->tm_mon = month; tm->tm_mday = temp + 1; tm->tm_isdst = 0; return tm;}RvTm *rvLocaltime_r(RvTime t, RvTm *tm){ /* To do local time, we should find out time zone offset */ /* and subtract it from the gmtime result along with */ /* any offset for daylight savings time if it is in effect */ return rvGmtime_r(t, tm);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -