Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

392 lines
9.5 KiB

/////////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998 Active Voice Corporation. All Rights Reserved.
//
// Active Agent(r) and Unified Communications(tm) are trademarks of Active Voice Corporation.
//
// Other brand and product names used herein are trademarks of their respective owners.
//
// The entire program and user interface including the structure, sequence, selection,
// and arrangement of the dialog, the exclusively "yes" and "no" choices represented
// by "1" and "2," and each dialog message are protected by copyrights registered in
// the United States and by international treaties.
//
// Protected by one or more of the following United States patents: 5,070,526, 5,488,650,
// 5,434,906, 5,581,604, 5,533,102, 5,568,540, 5,625,676, 5,651,054.
//
// Active Voice Corporation
// Seattle, Washington
// USA
//
/////////////////////////////////////////////////////////////////////////////////////////
////
// tim.c - time functions
////
#include "winlocal.h"
#include <time.h>
#include "tim.h"
#include "str.h"
////
// private definitions
////
// Time_t is stored as (hour * HOURFACTOR + minute * MINUTEFACTOR +
// second * SECONDFACTOR + millesecond)
// i.e. 23:59:59.999 is stored as 235959999
//
#define HOURFACTOR 10000000L
#define MINUTEFACTOR 100000L
#define SECONDFACTOR 1000L
// helper functions
//
////
// public functions
////
// Time - return time value representing hour, minute, second, and millesecond
// <h> (i) hour
// <m> (i) minute
// <s> (i) second
// <ms> (i) millesecond
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI Time(Hour_t h, Minute_t m, Second_t s, Millesecond_t ms)
{
Time_t time;
time = h * HOURFACTOR + m * MINUTEFACTOR + s * SECONDFACTOR + ms;
if (!TimeIsValid(time))
return (Time_t) 0;
return time;
}
// TimeNow - return time value representing current hour, minute, and second, and millesecond
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeNow(void)
{
static time_t timeCurr;
static struct tm *tmCurr;
timeCurr = time(NULL);
tmCurr = localtime(&timeCurr);
return Time((Hour_t) tmCurr->tm_hour, (Minute_t) tmCurr->tm_min,
(Second_t) tmCurr->tm_sec, (Millesecond_t) 0);
}
// TimeValue - return time value representing given time string
// <lpszTime> (i) time string to convert
// "23:59:59.999"
// etc.
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeValue(LPCTSTR lpszTime)
{
Hour_t h = 0;
Minute_t m = 0;
Second_t s = 0;
Millesecond_t ms = 0;
LPTSTR lpszDelimiters = TEXT(" \t/-.,;:");
TCHAR szTimeTmp[32];
LPTSTR lpszToken1;
LPTSTR lpszToken2;
LPTSTR lpszToken3;
LPTSTR lpszToken4;
*szTimeTmp = '\0';
if (lpszTime != NULL)
StrNCpy(szTimeTmp, lpszTime, SIZEOFARRAY(szTimeTmp));
lpszToken1 = StrTok(szTimeTmp, lpszDelimiters);
lpszToken2 = StrTok(NULL, lpszDelimiters);
lpszToken3 = StrTok(NULL, lpszDelimiters);
lpszToken4 = StrTok(NULL, lpszDelimiters);
h = (lpszToken1 == NULL ? 0 : StrAtoI(lpszToken1));
m = (lpszToken2 == NULL ? 0 : StrAtoI(lpszToken2));
s = (lpszToken3 == NULL ? 0 : StrAtoI(lpszToken3));
ms = (lpszToken4 == NULL ? 0 : StrAtoI(lpszToken4));
return Time(h, m, s, ms);
}
// TimeHour - return hour of a given time (0-23)
// <t> (i) time value
// return hour
//
Hour_t DLLEXPORT WINAPI TimeHour(Time_t t)
{
return (Hour_t) (t / HOURFACTOR);
}
// TimeMinute - return minute of a given time (0-59)
// <t> (i) time value
// return minute
//
Minute_t DLLEXPORT WINAPI TimeMinute(Time_t t)
{
return (Minute_t) ((t % HOURFACTOR) / MINUTEFACTOR);
}
// TimeSecond - return second of a given time (0-59)
// <t> (i) time value
// return second
//
Second_t DLLEXPORT WINAPI TimeSecond(Time_t t)
{
return (Second_t) ((t % MINUTEFACTOR) / SECONDFACTOR);
}
// TimeMillesecond - return millesecond of a given time (0-999)
// <t> (i) time value
// return second
//
Millesecond_t DLLEXPORT WINAPI TimeMillesecond(Time_t t)
{
return (Millesecond_t) ((t % MINUTEFACTOR) % SECONDFACTOR);
}
// TimeDayMillesecond - return millesecond since the start of the day for a given time
// <t> (i) time value
// return millesecond
//
long DLLEXPORT WINAPI TimeDayMillesecond(Time_t t)
{
Hour_t h;
Minute_t m;
Second_t s;
Millesecond_t ms;
if (!TimeIsValid(t))
return (Millesecond_t) 0;
h = TimeHour(t);
m = TimeMinute(t);
s = TimeSecond(t);
ms = TimeMillesecond(t);
return (long) (h * 60L * 60L * 1000L) +
(m * 60L * 1000L) + (s * 1000L) + ms;
}
// TimeIsValid - test <t> for validity
// <t> (i) time value
// return TRUE if valid
//
BOOL DLLEXPORT WINAPI TimeIsValid(Time_t t)
{
BOOL fValid = TRUE;
Hour_t h = TimeHour(t);
Minute_t m = TimeMinute(t);
Second_t s = TimeSecond(t);
Millesecond_t ms = TimeMillesecond(t);
// check for invalid hour, minute, second, or millesecond
//
if (h < 0 || h > 23 || m < 0 || m > 59 ||
s < 0 || s > 59 || ms < 0 || ms > 999)
fValid = FALSE;
return fValid;
}
// TimeIsAfternoon - return TRUE if <t> represents a time after noon
// <t> (i) time value
// return TRUE if leap hour
//
BOOL DLLEXPORT WINAPI TimeIsAfternoon(Time_t t)
{
return (BOOL) (TimeHour(t) >= 12);
}
// TimeNew - return time value which is <n> milleseconds from time <t>
// <t> (i) time value
// <n> (i) delta
// +1 one millesecond later
// -1 one millesecond earlier, etc.
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeNew(Time_t t, long n)
{
Hour_t h;
Minute_t m;
Second_t s;
Millesecond_t ms;
if (!TimeIsValid(t))
return (Time_t) 0;
h = TimeHour(t);
m = TimeMinute(t);
s = TimeSecond(t);
ms = TimeMillesecond(t);
if (n > 0)
{
// increment time n times
//
for ( ; n != 0; n--)
{
if (++ms == 1000)
{
ms = 0;
if (++s == 60)
{
s = 0;
if (++m == 60)
{
m = 0;
if (++h == 24)
h = 0;
}
}
}
}
}
else
{
// decrement time n times
//
for ( ; n != 0; n++)
{
if (--ms < 0)
{
ms = 999;
if (--s < 0)
{
s = 59;
if (--m < 0)
{
m = 59;
if (--h < 0)
h = 23;
}
}
}
}
}
return Time(h, m, s, ms);
}
// TimeCmp - return number of milleseconds between t1 and t2 (t1 minus t2)
// <t1> (i) time value
// <t2> (i) time value
// return milleseconds between times
//
long DLLEXPORT WINAPI TimeCmp(Time_t t1, Time_t t2)
{
return (long) (TimeDayMillesecond(t1) - TimeDayMillesecond(t2));
}
// TimeStartSecond - return time representing start the second relative to time <t>
// <t> (i) time value
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeStartSecond(Time_t t)
{
return Time(TimeHour(t), TimeMinute(t), TimeSecond(t), 0);
}
// TimeEndSecond - return time representing end of the second relative to time <t>
// <t> (i) time value
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeEndSecond(Time_t t)
{
return Time(TimeHour(t), TimeMinute(t), TimeSecond(t), 999);
}
// TimeStartMinute - return time representing start the minute relative to time <t>
// <t> (i) time value
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeStartMinute(Time_t t)
{
return Time(TimeHour(t), TimeMinute(t), 0, 0);
}
// TimeEndMinute - return time representing end of the minute relative to time <t>
// <t> (i) time value
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeEndMinute(Time_t t)
{
return Time(TimeHour(t), TimeMinute(t), 59, 999);
}
// TimeStartHour - return time representing start of the hour relative to time <t>
// <t> (i) time value
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeStartHour(Time_t t)
{
return Time(TimeHour(t), 0, 0, 0);
}
// TimeEndHour - return time representing end of the hour relative to time <t>
// <t> (i) time value
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeEndHour(Time_t t)
{
return Time(TimeHour(t), 59, 59, 999);
}
// TimeStartLastSecond - return time representing start of previous second
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeStartLastSecond(void)
{
return TimeStartSecond(TimeEndLastSecond());
}
// TimeEndLastSecond - return time representing end of previous second
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeEndLastSecond(void)
{
return TimeNew(TimeStartSecond(TimeNow()), -1);
}
// TimeStartLastMinute - return time representing start of previous minute
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeStartLastMinute(void)
{
return TimeStartMinute(TimeEndLastMinute());
}
// TimeEndLastMinute - return time representing end of previous minute
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeEndLastMinute(void)
{
return TimeNew(TimeStartMinute(TimeNow()), -1);
}
// TimeStartLastHour - return time representing start of previous hour
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeStartLastHour(void)
{
return TimeStartHour(TimeEndLastHour());
}
// TimeEndLastHour - return time representing end of previous hour
// return time value (0 if error)
//
Time_t DLLEXPORT WINAPI TimeEndLastHour(void)
{
return TimeNew(TimeStartHour(TimeNow()), -1);
}