summaryrefslogtreecommitdiffstats
path: root/private/ntos/rtl/stdtimep.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/rtl/stdtimep.h')
-rw-r--r--private/ntos/rtl/stdtimep.h450
1 files changed, 450 insertions, 0 deletions
diff --git a/private/ntos/rtl/stdtimep.h b/private/ntos/rtl/stdtimep.h
new file mode 100644
index 000000000..875faac3f
--- /dev/null
+++ b/private/ntos/rtl/stdtimep.h
@@ -0,0 +1,450 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ stdtimep.h
+
+Abstract:
+
+ This module contains definitions and function prototypes which are local to
+ stdime.c and fmttime.c.
+
+Author:
+
+ Rob McKaughan (t-robmc) 17-Jul-1991
+
+Revision History:
+
+--*/
+
+#ifndef _STD_TIME_P_
+#define _STD_TIME_P_
+
+//
+// These are the magic numbers needed to do our extended division. The
+// only numbers we ever need to divide by are
+//
+// 10,000 = convert 100ns tics to millisecond tics
+//
+// 10,000,000 = convert 100ns tics to one second tics
+//
+// 86,400,000 = convert Millisecond tics to one day tics
+//
+
+extern LARGE_INTEGER Magic10000;
+#define SHIFT10000 13
+
+extern LARGE_INTEGER Magic10000000;
+#define SHIFT10000000 23
+
+extern LARGE_INTEGER Magic86400000;
+#define SHIFT86400000 26
+
+//
+// To make the code more readable we'll also define some macros to
+// do the actual division for use
+//
+
+#define Convert100nsToMilliseconds(LARGE_INTEGER) ( \
+ RtlExtendedMagicDivide( (LARGE_INTEGER), Magic10000, SHIFT10000 ) \
+ )
+
+#define ConvertMillisecondsTo100ns(MILLISECONDS) ( \
+ RtlExtendedIntegerMultiply( (MILLISECONDS), 10000 ) \
+ )
+
+#define Convert100nsToSeconds(LARGE_INTEGER) ( \
+ RtlExtendedMagicDivide( (LARGE_INTEGER), Magic10000000, SHIFT10000000 ) \
+ )
+
+#define ConvertSecondsTo100ns(SECONDS) ( \
+ RtlExtendedIntegerMultiply( (SECONDS), 10000000L ) \
+ )
+
+#define ConvertMillisecondsToDays(LARGE_INTEGER) ( \
+ RtlExtendedMagicDivide( (LARGE_INTEGER), Magic86400000, SHIFT86400000 ) \
+ )
+
+///////////////////////////////////////////////////////////////////////////////
+// //
+// Macros for Time Differentials and Time Revisions //
+// //
+///////////////////////////////////////////////////////////////////////////////
+
+//
+// The following define the minimum and maximum possible values for the Time
+// Differential Factor as defined by ISO 4031-1978.
+//
+
+#define MAX_STDTIME_TDF (780)
+#define MIN_STDTIME_TDF (-720)
+
+//
+// The revision of this design (will be inserted in the revision field of any
+// STANDARD_TIMEs created by this revision).
+//
+
+#define STDTIME_REVISION (4)
+
+
+//
+// The number of bits we need to shift to get to and from a revision in a
+// StdTime.TdfAndRevision field.
+//
+
+#define STDTIME_REVISION_SHIFT 12
+
+
+//
+// USHORT
+// ShiftStandardTimeRevision(
+// IN USHORT Rev
+// )
+// Description:
+// This routine shifts the given revision number to its proper place for
+// storing in a STANDARD_TIME.TdfAndRevision field.
+//
+
+#define ShiftStandardTimeRevision(Rev) \
+ ((USHORT) ((Rev) << STDTIME_REVISION_SHIFT))
+
+
+//
+// The pre-shifted value of the current revision
+//
+
+#define SHIFTED_STDTIME_REVISION (ShiftStandardTimeRevision(STDTIME_REVISION))
+
+
+//
+// The bit mask used to mask a STANDARD_TIME.TdfAndRevision field to retrieve
+// the Tdf value.
+//
+
+#define TDF_MASK ((USHORT) 0x0fff)
+
+
+//
+// USHORT
+// MaskStandardTimeTdf(
+// IN USHORT Tdf
+// )
+// Description:
+// This routine masks the given tdf field with TDF_MASK and returns the
+// result.
+//
+// BUG: Byte order dependant
+//
+
+#define MaskStandardTimeTdf(Tdf) ((USHORT) ((Tdf) & TDF_MASK))
+
+
+//
+// SHORT
+// GetStandardTimeTdf(
+// IN STANDARD_TIME
+// )
+// Description:
+// This routine gets the Time Differential Factor from a tdf field and
+// makes any adjustments necessary to preserve the sign of the TDF.
+// The resulting TDF is returned.
+//
+// Since the TDF is stored as a signed 12 bit int, it's sign bit is the
+// bit 0x0800. To make it a 16 bit negative, we subtract 0x1000 from the
+// bottome 12 bits of the TdfAndRevision field.
+//
+// BUG: Byte order dependant
+//
+
+#define GetStandardTimeTdf(StdTime) \
+ ((SHORT) \
+ (((StdTime)->TdfAndRevision) & 0x0800) \
+ ? (MaskStandardTimeTdf((StdTime)->TdfAndRevision) - 0x1000) \
+ : MaskStandardTimeTdf((StdTime)->TdfAndRevision) \
+ )
+
+
+//
+// USHORT
+// GetStandardTimeRev(
+// IN USHORT Tdf
+// )
+// Description:
+// This routine gets the revision number from a tdf field and returns it
+// shifted back down to its place as a SHORT.
+//
+
+#define GetStandardTimeRev(StdTime) \
+ ((USHORT) (((StdTime)->TdfAndRevision) >> STDTIME_REVISION_SHIFT))
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// //
+// Tests for absolute and delta times //
+// //
+///////////////////////////////////////////////////////////////////////////////
+
+//
+// BOOLEAN
+// IsPositive(
+// IN LARGE_INTEGER Time
+// )
+// Returns:
+// TRUE - if the time in Time is positive.
+// FALSE - if Time is negative.
+//
+
+#define IsPositive(Time) \
+ ( ((Time).HighPart > 0) || (((Time).HighPart = 0) & ((Time).LowPart > 0)) )
+
+//
+// BOOLEAN
+// IsAbsoluteTime(
+// IN PSTANDARDTIME Time
+// )
+// Returns:
+// TRUE - if the given time is an absolute time
+// FALSE - If the given time is not an absolute time
+//
+
+#define IsAbsoluteTime(Time) \
+ ( IsPositive(Time->SimpleTime) )
+
+
+//
+// BOOLEAN
+// IsDeltaTime(
+// IN PSTANDARDTIME Time
+// )
+// Returns:
+// TRUE - if the given time is a delta time
+// FALSE - If the given time is not a delta time
+//
+
+#define IsDeltaTime(Time) \
+ ( !IsAbsoluteTime(Time) )
+
+
+//
+// BOOLEAN
+// GreaterThanTime(
+// IN PLARGE_INTEGER Time1,
+// IN PLARGE_INTEGER Time2
+// )
+// Returns:
+// TRUE - If Time1 is greater (older) than Time2
+// FALSE - If not
+//
+// BUG: Byte order dependant
+// BUG: Only works on absolute times
+//
+
+#define GreaterThanTime(Time1, Time2) \
+ ( \
+ ((Time1).HighPart > (Time2).HighPart) \
+ || \
+ ( \
+ ((Time1).HighPart == (Time2).HighPart) \
+ && \
+ ((Time1).LowPart > (Time2).LowPart) \
+ ) \
+ )
+
+
+//
+// BOOLEAN
+// GreaterThanStandardTime(
+// IN PSTANDARD_TIME Time1,
+// IN PSTANDARD_TIME Time2
+// )
+// Returns:
+// TRUE - If Time1 is greater (older) than Time2
+// FALSE - If not
+//
+
+#define GreaterThanStdTime(Time1, Time2) \
+ GreaterThanTime((Time1).SimpleTime, (Time2).SimpleTime)
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// /
+// The following definitions and declarations are some important constants /
+// used in the time conversion routines /
+// /
+//////////////////////////////////////////////////////////////////////////////
+
+//
+// This is the week day that January 1st, 1601 fell on (a Monday)
+//
+
+#define WEEKDAY_OF_1601 1
+
+//
+// These are known constants used to convert 1970 and 1980 times to 1601
+// times. They are the number of seconds from the 1601 base to the start
+// of 1970 and the start of 1980. The number of seconds from 1601 to
+// 1970 is 369 years worth, or (369 * 365) + 89 leap days = 134774 days, or
+// 134774 * 864000 seconds, which is equal to the large integer defined
+// below. The number of seconds from 1601 to 1980 is 379 years worth, or etc.
+//
+// These are declared in time.c
+//
+
+extern LARGE_INTEGER SecondsToStartOf1970;
+extern LARGE_INTEGER SecondsToStartOf1980;
+
+
+//
+// ULONG
+// ElapsedDaysToYears (
+// IN ULONG ElapsedDays
+// );
+//
+// To be completely true to the Gregorian calendar the equation to
+// go from days to years is really
+//
+// ElapsedDays / 365.2425
+//
+// But because we are doing the computation in ulong integer arithmetic
+// and the LARGE_INTEGER variable limits the number of expressible days to around
+// 11,000,000 we use the following computation
+//
+// (ElapsedDays * 128 + 127) / (365.2425 * 128)
+//
+// which will be off from the Gregorian calendar in about 150,000 years
+// but that doesn't really matter because LARGE_INTEGER can only express around
+// 30,000 years
+//
+
+#define ElapsedDaysToYears(DAYS) ( \
+ ((DAYS) * 128 + 127) / 46751 \
+ )
+
+//
+// ULONG
+// NumberOfLeapYears (
+// IN ULONG ElapsedYears
+// );
+//
+// The number of leap years is simply the number of years divided by 4
+// minus years divided by 100 plus years divided by 400. This says
+// that every four years is a leap year except centuries, and the
+// exception to the exception is the quadricenturies
+//
+
+#define NumberOfLeapYears(YEARS) ( \
+ ((YEARS) / 4) - ((YEARS) / 100) + ((YEARS) / 400) \
+ )
+
+//
+// ULONG
+// ElapsedYearsToDays (
+// IN ULONG ElapsedYears
+// );
+//
+// The number of days contained in elapsed years is simply the number
+// of years times 365 (because every year has at least 365 days) plus
+// the number of leap years there are (i.e., the number of 366 days years)
+//
+
+#define ElapsedYearsToDays(YEARS) ( \
+ ((YEARS) * 365) + NumberOfLeapYears(YEARS) \
+ )
+
+//
+// BOOLEAN
+// IsLeapYear (
+// IN ULONG ElapsedYears
+// );
+//
+// If it is an even 400 or a non century leapyear then the
+// answer is true otherwise it's false
+//
+
+#define IsLeapYear(YEARS) ( \
+ (((YEARS) % 400 == 0) || \
+ ((YEARS) % 100 != 0) && ((YEARS) % 4 == 0)) ? \
+ TRUE \
+ : \
+ FALSE \
+ )
+
+//
+// ULONG
+// MaxDaysInMonth (
+// IN ULONG Year,
+// IN ULONG Month
+// );
+//
+// The maximum number of days in a month depend on the year and month.
+// It is the difference between the days to the month and the days
+// to the following month
+//
+
+#define MaxDaysInMonth(YEAR,MONTH) ( \
+ IsLeapYear(YEAR) ? \
+ LeapYearDaysPrecedingMonth[(MONTH) + 1] - \
+ LeapYearDaysPrecedingMonth[(MONTH)] \
+ : \
+ NormalYearDaysPrecedingMonth[(MONTH) + 1] - \
+ NormalYearDaysPrecedingMonth[(MONTH)] \
+ )
+
+
+//
+// Local utlity function prototypes
+//
+
+VOID
+RtlpConvert48To64(
+ IN PSTDTIME_ERROR num48,
+ OUT LARGE_INTEGER *num64
+ );
+
+NTSTATUS
+RtlpConvert64To48(
+ IN LARGE_INTEGER num64,
+ OUT PSTDTIME_ERROR num48
+ );
+
+LARGE_INTEGER
+RtlpTimeToLargeInt(
+ IN LARGE_INTEGER Time
+ );
+
+LARGE_INTEGER
+RtlpLargeIntToTime(
+ IN LARGE_INTEGER Int
+ );
+
+NTSTATUS
+RtlpAdd48Int(
+ IN PSTDTIME_ERROR First48,
+ IN PSTDTIME_ERROR Second48,
+ IN PSTDTIME_ERROR Result48
+ );
+
+NTSTATUS
+RtlpAddTime(
+ IN LARGE_INTEGER Time1,
+ IN LARGE_INTEGER Time2,
+ OUT PLARGE_INTEGER Result
+ );
+
+NTSTATUS
+RtlpSubtractTime(
+ IN LARGE_INTEGER Time1,
+ IN LARGE_INTEGER Time2,
+ OUT PLARGE_INTEGER Result
+ );
+
+LARGE_INTEGER
+RtlpAbsTime(
+ IN LARGE_INTEGER Time
+ );
+
+#endif //_STD_TIME_P_