Annotation of embedaddon/php/ext/calendar/french.c, revision 1.1.1.1
1.1 misho 1: /* $selId: french.c,v 2.0 1995/10/24 01:13:06 lees Exp $
2: * Copyright 1993-1995, Scott E. Lee, all rights reserved.
3: * Permission granted to use, copy, modify, distribute and sell so long as
4: * the above copyright and this permission statement are retained in all
5: * copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
6: */
7:
8: /**************************************************************************
9: *
10: * These are the externally visible components of this file:
11: *
12: * void
13: * SdnToFrench(
14: * long int sdn,
15: * int *pYear,
16: * int *pMonth,
17: * int *pDay);
18: *
19: * Convert a SDN to a French republican calendar date. If the input SDN is
20: * before the first day of year 1 or after the last day of year 14, the
21: * three output values will all be set to zero, otherwise *pYear will be in
22: * the range 1 to 14 inclusive; *pMonth will be in the range 1 to 13
23: * inclusive; *pDay will be in the range 1 to 30 inclusive. If *pMonth is
24: * 13, the SDN represents one of the holidays at the end of the year and
25: * *pDay will be in the range 1 to 6 inclusive.
26: *
27: * long int
28: * FrenchToSdn(
29: * int year,
30: * int month,
31: * int day);
32: *
33: * Convert a French republican calendar date to a SDN. Zero is returned
34: * when the input date is detected as invalid or out of the supported
35: * range. The return value will be > 0 for all valid, supported dates, but
36: * there are some invalid dates that will return a positive value. To
37: * verify that a date is valid, convert it to SDN and then back and compare
38: * with the original.
39: *
40: * char *FrenchMonthName[14];
41: *
42: * Convert a French republican month number (1 to 13) to the name of the
43: * French republican month (null terminated). An index of 13 (for the
44: * "extra" days at the end of the year) will return the string "Extra". An
45: * index of zero will return a zero length string.
46: *
47: * VALID RANGE
48: *
49: * These routines only convert dates in years 1 through 14 (Gregorian
50: * dates 22 September 1792 through 22 September 1806). This more than
51: * covers the period when the calendar was in use.
52: *
53: * I would support a wider range of dates, but I have not been able to
54: * find an authoritative definition of when leap years were to have
55: * occurred. There are suggestions that it was to skip a leap year ever
56: * 100 years like the Gregorian calendar.
57: *
58: * CALENDAR OVERVIEW
59: *
60: * The French republican calendar was adopted in October 1793 during
61: * the French Revolution and was abandoned in January 1806. The intent
62: * was to create a new calendar system that was based on scientific
63: * principals, not religious traditions.
64: *
65: * The year is divided into 12 months of 30 days each. The remaining 5
66: * to 6 days in the year are grouped at the end and are holidays. Each
67: * month is divided into three decades (instead of weeks) of 10 days
68: * each.
69: *
70: * The epoch (first day of the first year) is 22 September 1792 in the
71: * Gregorian calendar. Leap years are every fourth year (year 3, 7,
72: * 11, etc.)
73: *
74: * TESTING
75: *
76: * This algorithm has been tested from the year 1 to 14. The source
77: * code of the verification program is included in this package.
78: *
79: * REFERENCES
80: *
81: * I have found no detailed, authoritative reference on this calendar.
82: * The algorithms are based on a preponderance of less authoritative
83: * sources.
84: *
85: **************************************************************************/
86:
87: #include "sdncal.h"
88:
89: #define FRENCH_SDN_OFFSET 2375474
90: #define DAYS_PER_4_YEARS 1461
91: #define DAYS_PER_MONTH 30
92: #define FIRST_VALID 2375840
93: #define LAST_VALID 2380952
94:
95: void SdnToFrench(
96: long int sdn,
97: int *pYear,
98: int *pMonth,
99: int *pDay)
100: {
101: long int temp;
102: int dayOfYear;
103:
104: if (sdn < FIRST_VALID || sdn > LAST_VALID) {
105: *pYear = 0;
106: *pMonth = 0;
107: *pDay = 0;
108: return;
109: }
110: temp = (sdn - FRENCH_SDN_OFFSET) * 4 - 1;
111: *pYear = temp / DAYS_PER_4_YEARS;
112: dayOfYear = (temp % DAYS_PER_4_YEARS) / 4;
113: *pMonth = dayOfYear / DAYS_PER_MONTH + 1;
114: *pDay = dayOfYear % DAYS_PER_MONTH + 1;
115: }
116:
117: long int FrenchToSdn(
118: int year,
119: int month,
120: int day)
121: {
122: /* check for invalid dates */
123: if (year < 1 || year > 14 ||
124: month < 1 || month > 13 ||
125: day < 1 || day > 30) {
126: return (0);
127: }
128: return ((year * DAYS_PER_4_YEARS) / 4
129: + (month - 1) * DAYS_PER_MONTH
130: + day
131: + FRENCH_SDN_OFFSET);
132: }
133:
134: char *FrenchMonthName[14] =
135: {
136: "",
137: "Vendemiaire",
138: "Brumaire",
139: "Frimaire",
140: "Nivose",
141: "Pluviose",
142: "Ventose",
143: "Germinal",
144: "Floreal",
145: "Prairial",
146: "Messidor",
147: "Thermidor",
148: "Fructidor",
149: "Extra"
150: };
151:
152:
153: /*
154: * Local variables:
155: * tab-width: 4
156: * c-basic-offset: 4
157: * End:
158: * vim600: sw=4 ts=4 fdm=marker
159: * vim<600: sw=4 ts=4
160: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>