home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / sun / volume1 / calentool / part04 / holidays.c < prev   
Encoding:
C/C++ Source or Header  |  1989-05-27  |  9.4 KB  |  374 lines

  1. /*
  2.  * $Header: holidays.c,v 2.1 89/05/09 14:19:10 billr Exp $
  3.  */
  4. /*
  5.  * holidays.c
  6.  *
  7.  * Author: Bill Randle, Tektronix, Inc. <billr@saab.CNA.TEK.COM>
  8.  *    (based on a test driver by R.P.C. Rodgers)
  9.  *
  10.  * Copyright (C) 1989, Tektronix, Inc.  All Rights Reserved
  11.  *
  12.  * Permission is hereby granted to use and modify this code in source
  13.  * or binary form as long as it is not sold for profit and this copyright
  14.  * notice remains intact.
  15.  */
  16. /*
  17.  * functions from datelib (by R.P.C. Rodgers)
  18.  */
  19. #include "ct.h"        /* for the NO_HOLIDAYS #define */
  20. #ifndef NO_HOLIDAYS
  21.  
  22. #include <sys/time.h>
  23.  
  24. double    election_day();            /* Secular US holidays */
  25.  
  26. double    autumn_equinox(),        /* Astronomical events */
  27.     summer_solstice(),
  28.     vernal_equinox(),
  29.     winter_solstice();
  30.  
  31. double    ascension_day(),        /* Christian holidays */
  32.     ash_wednesday(),
  33.     corpus_christi(),
  34.     easter(),
  35.     easter_monday(),
  36.     easter_offset(),
  37.     first_sunday_advent(),
  38.     first_sunday_lent(),
  39.     fourth_sunday_lent(),
  40.     good_friday(),
  41.     maundy_thursday(),
  42.     palm_sunday(),
  43.     passion_sunday(),
  44.     rogation_sunday(),
  45.     septuagesima(),
  46.     sexagesima(),
  47.     quinquagesima(),
  48.     second_sunday_lent(),
  49.     shrove_monday(),
  50.     shrove_tuesday(),
  51.     third_sunday_lent(),
  52.     trinity_sunday(),
  53.     whitsunday();
  54.  
  55. double    islamic_new_year(),        /* Islamic holidays */
  56.     muharram_9(),
  57.     muharram_10(),
  58.     muharram_16(),
  59.     eid_i_milad_un_nabi(),
  60.     jumada_al_akhir_23(),
  61.     shab_e_miraj(),
  62.     shab_e_barat(),
  63.     shab_e_qadr(),
  64.     ramadan(),
  65.     eid_al_fitr(),
  66.     dhul_hijja_9(),
  67.     eid_al_adha(),
  68.     ghadir();
  69.  
  70. double    chanukah(),            /* Jewish holidays */
  71.     passover(),
  72.     passover_offset(),
  73.     purim(),
  74.     rosh_hashanah(),
  75.     shavuot(),
  76.     simchat_torah(),
  77.     sukkot(),
  78.     yom_kippur();
  79.  
  80. int    check_date();
  81.  
  82. extern struct tm current;    /* current day displayed from calentool */
  83. int    marked_note;
  84.  
  85. int
  86. a_dates(appt, flag)
  87. struct appt_entry *appt;
  88. int flag;
  89. {
  90.     /*
  91.      * Astromonical Events
  92.      */
  93.     if (!flag)
  94.         return(0);
  95.     marked_note = flag - 1;
  96.     if (check_date(appt, "Vernal Equinox", vernal_equinox, TRUE))
  97.         return(1);
  98.     if (check_date(appt, "Summer Solstice", summer_solstice, TRUE))
  99.         return(1);
  100.     if (check_date(appt, "Autumn Equinox", autumn_equinox, TRUE))
  101.         return(1);
  102.     if (check_date(appt, "Winter Solstice", winter_solstice, TRUE))
  103.         return(1);
  104.     return(0);
  105. }
  106.  
  107. int
  108. c_dates(appt, flag)
  109. struct appt_entry *appt;
  110. int flag;
  111. {
  112.     /*
  113.      * Christian holidays
  114.      */
  115.     if (!flag)
  116.         return(0);
  117.     marked_note = flag - 1;
  118.     if (check_date(appt, "Septuagesima Sunday", septuagesima, FALSE))
  119.         return(1);
  120.     if (check_date(appt, "Sexagesima Sunday", sexagesima, FALSE))
  121.         return(1);
  122.     if (check_date(appt, "Quinquagesima Sunday", quinquagesima, FALSE))
  123.         return(1);
  124.     if (check_date(appt, "Shrove Monday", shrove_monday, FALSE))
  125.         return(1);
  126.     if (check_date(appt, "Shrove Tuesday (Mardi Gras)", shrove_tuesday, FALSE))
  127.         return(1);
  128.     if (check_date(appt, "Ash Wednesday", ash_wednesday, FALSE))
  129.         return(1);
  130.     if (check_date(appt, "First Sunday in Lent", first_sunday_lent, FALSE))
  131.         return(1);
  132.     if (check_date(appt, "Second Sunday in Lent", second_sunday_lent, FALSE))
  133.         return(1);
  134.     if (check_date(appt, "Third Sunday in Lent", third_sunday_lent, FALSE))
  135.         return(1);
  136.     if (check_date(appt, "Fourth Sunday in Lent", fourth_sunday_lent, FALSE))
  137.         return(1);
  138.     if (check_date(appt, "Passion Sunday", passion_sunday, FALSE))
  139.         return(1);
  140.     if (check_date(appt, "Palm Sunday", palm_sunday, FALSE))
  141.         return(1);
  142.     if (check_date(appt, "Maundy Thursday", maundy_thursday, FALSE))
  143.         return(1);
  144.     if (check_date(appt, "Good Friday", good_friday, FALSE))
  145.         return(1);
  146.     if (check_date(appt, "Easter", easter, FALSE))
  147.         return(1);
  148.     if (check_date(appt, "Easter Monday (Canada)", easter_monday, FALSE))
  149.         return(1);
  150.     if (check_date(appt, "Rogation Sunday", rogation_sunday, FALSE))
  151.         return(1);
  152.     if (check_date(appt, "Ascension Day", ascension_day, FALSE))
  153.         return(1);
  154.     if (check_date(appt, "Whitsunday", whitsunday, FALSE))
  155.         return(1);
  156.     if (check_date(appt, "Trinity Sunday", trinity_sunday, FALSE))
  157.         return(1);
  158.     if (check_date(appt, "Corpus Christi", corpus_christi, FALSE))
  159.         return(1);
  160.     if (check_date(appt, "First Sunday in Advent", first_sunday_advent, FALSE))
  161.         return(1);
  162.     return(0);
  163. }
  164.  
  165. int
  166. i_dates(appt, flag)
  167. struct appt_entry *appt;
  168. int flag;
  169. {
  170.     double day, date1, date2;
  171.     int ndates, myear1, myear2=0;
  172.     int month, year;
  173.     char buf[16];
  174.  
  175.     /*
  176.      * Islamic holidays
  177.      */
  178.     if (!flag)
  179.         return(0);
  180.     marked_note = flag - 1;
  181.     if (check_idate(appt, "Muharram 1, %d A.H.: Islamic New Year", islamic_new_year))
  182.         return(1);
  183.     if (check_idate(appt, "Muharram 9, %d A.H.: Day of fasting", muharram_9))
  184.         return(1);
  185.     if (check_idate(appt,
  186.         "Muharram 10, %d A.H.: Deliverance of Moses from the Pharoah (for Shia Islam, martyrdom of Husain)", muharram_10))
  187.         return(1);
  188.     if (check_idate(appt, "Muharram 16, %d A.H. (Imamat Day; Ismaili Khoja)", muharram_16))
  189.         return(1);
  190.     if (check_idate(appt, "Rabi I 12, %d A.H. (Eid-i-Milad-un-Nabi: The Prophet's Birthday)", eid_i_milad_un_nabi))
  191.         return(1);
  192.     if (check_idate(appt, "Jumada al-Akhir 23, %d A.H. (Birth of Agha Khan IV, Ismaili)", jumada_al_akhir_23))
  193.         return(1);
  194.     if (check_idate(appt, "Rajab 27, %d A.H. (Shab-e-Mi'raj: The Prophet's Ascension)", shab_e_miraj))
  195.         return(1);
  196.     if (check_idate(appt, "Shaban 15, %d A.H. (Shab-e-Bara't: Night, followed by day of fasting)", shab_e_barat))
  197.         return(1);
  198.     if (check_idate(appt, "Ramadan 1, %d A.H. (Fasting month begins)", ramadan))
  199.         return(1);
  200.     if (check_idate(appt, "Ramadan 27, %d A.H. (Shab-e-Qadr: Night vigil))", shab_e_qadr))
  201.         return(1);
  202.     if (check_idate(appt, "Shawwal 1, %d A.H. (Eid-al-Fitr: Day of Feast)", eid_al_fitr))
  203.         return(1);
  204.     if (check_idate(appt, "Dhul-Hijj 9, %d A.H. (Day of Pilgrimage at Arafat, Mecca)", dhul_hijja_9))
  205.         return(1);
  206.     if (check_idate(appt, "Dhul-Hijj 10, %d A.H. (Eid-al-Azha: Day of Abraham's Sacrifice)", eid_al_adha))
  207.         return(1);
  208.     if (check_idate(appt, "Dhul-Hijj 18, %d A.H. (Ghadir: Ali's Nomination)", ghadir))
  209.         return(1);
  210.     return(0);
  211. }
  212.  
  213. int
  214. j_dates(appt, flag)
  215. struct appt_entry *appt;
  216. int flag;
  217. {
  218.     char buf[24];
  219.     int jyear;
  220.  
  221.     /*
  222.      * Jewish holidays
  223.      */
  224.     if (!flag)
  225.         return(0);
  226.     marked_note = flag - 1;
  227.     if (check_jdate(appt, "Purim", purim))
  228.         return(1);
  229.     if (check_jdate(appt, "First day of Passover", passover))
  230.         return(1);
  231.     if (check_jdate(appt, "Shavuot", shavuot))
  232.         return(1);
  233.     if (check_jdate(appt, "Rosh Hashanah (Jewish New Year)", rosh_hashanah))
  234.         return(1);
  235.     if (check_jdate(appt, "Yom Kippur", yom_kippur))
  236.         return(1);
  237.     if (check_jdate(appt, "First day of Sukkot (9 days)", sukkot))
  238.         return(1);
  239.     if (check_jdate(appt, "Simchat Torah", simchat_torah))
  240.         return(1);
  241.     if (check_jdate(appt, "First day of Chanukah (8 days)", chanukah))
  242.         return(1);
  243.     return(0);
  244. }
  245.  
  246. int
  247. s_dates(appt, flag)
  248. struct appt_entry *appt;
  249. int flag;
  250. {
  251.     /*
  252.      * SECULAR US HOLIDAYS
  253.      * [Holidays specified as a given date (e.g. July 4) or as
  254.      *  a known nth mday of a month (e.g. 2nd Monday) are not
  255.      *  calculated here.  They are available from one of the
  256.      *  auxillary date files.]
  257.      */
  258.     if (!flag)
  259.         return(0);
  260.     marked_note = flag - 1;
  261.     if (check_date(appt, "Election Day", election_day, FALSE))
  262.         return(1);
  263.     return(0);
  264. }
  265.  
  266. /*
  267.  * check for gregorian (i.e. US secular & Christian) holidays
  268.  */
  269. int
  270. check_date(aptr, str, func, timeflag)
  271. struct appt_entry *aptr;
  272. char *str;
  273. double (*func)();
  274. int timeflag;
  275. {
  276.     int    month, year;
  277.     double    day, hday;
  278.     char     *julian_time();
  279.  
  280.     hday = (*func)(current.tm_year+1900);
  281.     gregorian_date(&day, &month, &year, hday);
  282.     if (current.tm_mon == --month && current.tm_mday == (int)day) {
  283.         aptr->year = current.tm_year;
  284.         aptr->month = current.tm_mon;
  285.         aptr->day = current.tm_mday;
  286.         aptr->arrows = aptr->repeat = aptr->lookahead = 0;
  287.         aptr->flags = (A_NOTE | READONLY);
  288.         if (marked_note)
  289.             aptr->flags |= MARKED;
  290.         strcpy(aptr->str, str);
  291.         if (timeflag) {
  292.             strcat(aptr->str, julian_time(hday));
  293.             strcat(aptr->str, " GMT");
  294.         }
  295.         return(1);
  296.     }
  297.     return(0);
  298. }
  299.  
  300. /*
  301.  * check for Islamic holidays
  302.  */
  303. int
  304. check_idate(aptr, str, func)
  305. struct appt_entry *aptr;
  306. char *str;
  307. int (*func)();
  308. {
  309.     double    day, date1, date2;
  310.     int    nr_dates, year1, year2;
  311.     int    month, year;
  312.     int    match = 0;
  313.  
  314.     (void)(*func)(current.tm_year+1900, &nr_dates, &date1, &date2, &year1, &year2);
  315.     gregorian_date(&day, &month, &year, date1);
  316.     if (current.tm_mon == --month && current.tm_mday == (int)day)
  317.         match = 1;
  318.     else if (nr_dates == 2) {
  319.         gregorian_date(&day, &month, &year, date2);
  320.         if (current.tm_mon == --month && current.tm_mday == (int)day)
  321.             match = 2;
  322.     }
  323.     if (match) {
  324.         aptr->year = current.tm_year;
  325.         aptr->month = current.tm_mon;
  326.         aptr->day = current.tm_mday;
  327.         aptr->arrows = aptr->repeat = aptr->lookahead = 0;
  328.         aptr->flags = (A_NOTE | READONLY);
  329.         if (marked_note)
  330.             aptr->flags |= MARKED;
  331.         if (match == 1)
  332.             /* match was on first year */
  333.             sprintf(aptr->str, str, year1);
  334.         else
  335.             /* must have been second year */
  336.             sprintf(aptr->str, str, year2);
  337.         return(1);
  338.     }
  339.     return(0);
  340. }
  341.  
  342. /*
  343.  * check for Jewish holidays
  344.  */
  345. int
  346. check_jdate(aptr, str, func)
  347. struct appt_entry *aptr;
  348. char *str;
  349. double (*func)();
  350. {
  351.     int    month, year, jyear;
  352.     double    hday, day;
  353.     char    buf[32];
  354.  
  355.     hday = (*func)(current.tm_year+1900, &jyear);
  356.     gregorian_date(&day, &month, &year, hday);
  357.     if (current.tm_mon == --month && current.tm_mday == (int)day) {
  358.  
  359.         aptr->year = current.tm_year;
  360.         aptr->month = current.tm_mon;
  361.         aptr->day = current.tm_mday;
  362.         aptr->arrows = aptr->repeat = aptr->lookahead = 0;
  363.         aptr->flags = (A_NOTE | READONLY);
  364.         if (marked_note)
  365.             aptr->flags |= MARKED;
  366.         strcpy(aptr->str, str);
  367.         sprintf(buf, " [Jewish year %d]", jyear);
  368.         strcat(aptr->str, buf);
  369.         return(1);
  370.     }
  371.     return(0);
  372. }
  373. #endif    /* NO_HOLIDAYS */
  374.