1 /*	$NetBSD: ntp_calendar.h,v 1.1.1.1 2009/12/13 16:54:48 kardel Exp $	*/
2 
3 /*
4  * ntp_calendar.h - definitions for the calendar time-of-day routine
5  */
6 #ifndef NTP_CALENDAR_H
7 #define NTP_CALENDAR_H
8 
9 #include "ntp_types.h"
10 
11 struct calendar {
12 	u_short year;		/* year (A.D.) */
13 	u_short yearday;	/* day of year, 1 = January 1 */
14 	u_char month;		/* month, 1 = January */
15 	u_char monthday;	/* day of month */
16 	u_char hour;		/* hour of day, midnight = 0 */
17 	u_char minute;		/* minute of hour */
18 	u_char second;		/* second of minute */
19 };
20 
21 /*
22  * Days in each month.  30 days hath September...
23  */
24 #define	JAN	31
25 #define	FEB	28
26 #define	FEBLEAP	29
27 #define	MAR	31
28 #define	APR	30
29 #define	MAY	31
30 #define	JUN	30
31 #define	JUL	31
32 #define	AUG	31
33 #define	SEP	30
34 #define	OCT	31
35 #define	NOV	30
36 #define	DEC	31
37 
38 /*
39  * We deal in a 4 year cycle starting at March 1, 1900.  We assume
40  * we will only want to deal with dates since then, and not to exceed
41  * the rollover day in 2036.
42  */
43 #define	SECSPERMIN	(60)			/* seconds per minute */
44 #define	MINSPERHR	(60)			/* minutes per hour */
45 #define	HRSPERDAY	(24)			/* hours per day */
46 #define	DAYSPERYEAR	(365)			/* days per year */
47 
48 #define	SECSPERDAY	(SECSPERMIN*MINSPERHR*HRSPERDAY)
49 #define	SECSPERYEAR	(365 * SECSPERDAY)	/* regular year */
50 #define	SECSPERLEAPYEAR	(366 * SECSPERDAY)	/* leap year */
51 
52 #define	MAR1900		((JAN+FEB) * SECSPERDAY) /* no leap year in 1900 */
53 #define	DAYSPERCYCLE	(365+365+365+366)	/* 3 normal years plus leap */
54 #define	SECSPERCYCLE	(DAYSPERCYCLE*SECSPERDAY)
55 #define	YEARSPERCYCLE	4
56 
57 /*
58  * Gross hacks.  I have illicit knowlege that there won't be overflows
59  * here, the compiler often can't tell this.
60  */
61 #define	TIMES60(val)	((((val)<<4) - (val))<<2)	/* *(16 - 1) * 4 */
62 #define	TIMES24(val)	(((val)<<4) + ((val)<<3))	/* *16 + *8 */
63 #define	TIMES7(val)	(((val)<<3) - (val))		/* *8  - *1 */
64 #define	TIMESDPERC(val)	(((val)<<10) + ((val)<<8) \
65 			+ ((val)<<7) + ((val)<<5) \
66 			+ ((val)<<4) + ((val)<<2) + (val))	/* *big* hack */
67 
68 /*
69  * Another big hack.  Cycle 22 started on March 1, 1988.  This is
70  * STARTCYCLE22 seconds after the start of cycle 0.
71  */
72 #define	CYCLE22		(22)
73 #define	STARTCYCLE22	(u_long)(0xa586b500)	/* 2777068800 */
74 #define	MAR1988		(u_long)(STARTCYCLE22 + (u_long)MAR1900)
75 
76 /*
77  * The length of January + February in leap and non-leap years.
78  */
79 #define	JANFEBNOLEAP	((JAN+FEB) * SECSPERDAY)
80 #define	JANFEBLEAP	((JAN+FEBLEAP) * SECSPERDAY)
81 
82 
83 extern	void	caljulian	(u_long, struct calendar *);
84 extern	u_long	caltontp	(const struct calendar *);
85 
86 /*
87  * Additional support stuff for Ed Rheingold's calendrical calculations
88  */
89 
90 /*
91  * Start day of NTP time as days past the imaginary date 12/1/1 BC.
92  * (This is the beginning of the Christian Era, or BCE.)
93  */
94 #define	DAY_NTP_STARTS 693596
95 /*
96  * The Gregorian calendar is based on a 400 year cycle.  This is the number
97  * of days in each cycle.
98  */
99 #define	GREGORIAN_CYCLE_DAYS 146097
100 
101 /*
102  * Days in a normal 100 year leap year calendar.  We lose a leap year day
103  * in years evenly divisible by 100 but not by 400.
104  */
105 #define	GREGORIAN_NORMAL_CENTURY_DAYS 36524
106 
107 /*
108  * Days in a normal 4 year leap year calendar cycle.
109  */
110 #define	GREGORIAN_NORMAL_LEAP_CYCLE_DAYS 1461
111 
112 #define	is_leapyear(y)	(!((y) % 4) && !(!((y) % 100) && (y) % 400))
113 
114 #endif
115