Annotation of embedaddon/php/ext/calendar/french.c, revision 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>