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>