home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / qtawk / holiday.exp < prev    next >
Text File  |  1990-04-23  |  5KB  |  162 lines

  1. #
  2. # QTAwk utility for computing dates of holidays.
  3. #
  4. BEGIN {
  5.     # gregorian/julian calender
  6.     # TRUE == julian calender
  7.     greg_jul = FALSE;
  8.     month_array[ 1] = "January";
  9.     month_array[ 2] = "Febuary";
  10.     month_array[ 3] = "March";
  11.     month_array[ 4] = "April";
  12.     month_array[ 5] = "May";
  13.     month_array[ 6] = "June";
  14.     month_array[ 7] = "July";
  15.     month_array[ 8] = "August";
  16.     month_array[ 9] = "September";
  17.     month_array[10] = "October";
  18.     month_array[11] = "November";
  19.     month_array[12] = "December";
  20.     week_day[0] = "Sunday";
  21.     week_day[1] = "Monday";
  22.     week_day[2] = "Tuesday";
  23.     week_day[3] = "Wednesday";
  24.     week_day[4] = "Thursday";
  25.     week_day[5] = "Friday";
  26.     week_day[6] = "Saturday";
  27.     # month of pass-over
  28.     psm = 3;
  29.     leader = copies(" ",20) ∩ ": ";
  30. }
  31.  
  32. # /^{_w}*{_d}(4,4}({_w}|$)/ {
  33.     {
  34.     dates($1);
  35.     printf("\nHolidays for %4u\n",$1);
  36.     holiday = overlay(leader,"Purim",1);
  37.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[purim[2]],week_day[purim[0]],purim[2],purim[3],purim[1]);
  38.  
  39.     holiday = overlay(leader,"Pass Over",1);
  40.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[pass_over[2]],week_day[pass_over[0]],pass_over[2],pass_over[3],pass_over[1]);
  41.  
  42.     holiday = overlay(leader,"Shavuot",1);
  43.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[shavuot[2]],week_day[shavuot[0]],shavuot[2],shavuot[3],shavuot[1]);
  44.  
  45.     holiday = overlay(leader,"Rosh Hashana",1);
  46.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[rosh_hashana[2]],week_day[rosh_hashana[0]],rosh_hashana[2],rosh_hashana[3],rosh_hashana[1]);
  47.  
  48.     holiday = overlay(leader,"Yom Kippur",1);
  49.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[yom_kippur[2]],week_day[yom_kippur[0]],yom_kippur[2],yom_kippur[3],yom_kippur[1]);
  50.  
  51.     holiday = overlay(leader,"Sukkot",1);
  52.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[sukkot[2]],week_day[sukkot[0]],sukkot[2],sukkot[3],sukkot[1]);
  53.  
  54.     holiday = overlay(leader,"Simchat Torah",1);
  55.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[simchat_torah[2]],week_day[simchat_torah[0]],simchat_torah[2],simchat_torah[3],simchat_torah[1]);
  56.  
  57.     holiday = overlay(leader,"Hanukkah",1);
  58.     printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[hanukkah[2]],week_day[hanukkah[0]],hanukkah[2],hanukkah[3],hanukkah[1]);
  59. }
  60.  
  61. function dates(year) {
  62.     local M1, M2, ha, rh, day;
  63.  
  64.     M1 = pass_over_day(year);
  65.     M2 = pass_over_day(year + 1);
  66.     ha = (M2 - M1) % 5 ? -1 : 0;
  67.     greg_jul = TRUE;
  68.     pass_over = jdn(year,psm,M1);
  69.     greg_jul = FALSE;
  70.     day = pass_over + 50;
  71.     shavuot = caln(day);
  72.     shavout[0] = (day + 1) % 7;
  73.     rh = pass_over + 163;
  74.     rosh_hashana = caln(rh);
  75.     rosh_hashana[0] = (day + 1) % 7;
  76.     day = pass_over + 172;
  77.     yom_kippur = caln(day);
  78.     yom_kippur[0] = (day + 1) % 7;
  79.     day = pass_over + 247 + ha;
  80.     hanukkah = caln(day);
  81.     hanukkah[0] = (day + 1) % 7;
  82.     day = pass_over - 30;
  83.     purim = caln(day);
  84.     purim[0] = (day + 1) % 7;
  85.     day = rh + 14;
  86.     sukkot = caln(day);
  87.     sukkot[0] = (day + 1) % 7;
  88.     day = rh + 22;
  89.     simchat_torah = caln(day);
  90.     simchat_torah[0] = (day + 1) % 7;
  91.     day = pass_over;
  92.     pass_over = caln(day);
  93.     pass_over[0] = (day + 1) % 7;
  94. }
  95.  
  96. function pass_over_day(year) {
  97.     local r1 = 23269.0/25920;
  98.     local r2 = 1367.0/2160;
  99.     local r3 = 272953.0/492480;
  100.     local r4 = 4343.0/98496;
  101.     local A, a, b, N, M, M1, C;
  102.  
  103.     A = year + 3760;
  104.     a = (12*A + 17) % 19;
  105.     b = A % 4;
  106.     N= (1 + r3)*a + b/4.0 + 32 + r4 - A/315.0;
  107.     M = int(N);
  108.     m = fract(N);
  109.     C = (3*A + 5*b + M + 5) % 7;
  110.     switch ( C ) {
  111.     case 0:
  112.         if ( a > 11 && m >= r1 ) M++;
  113.         break;
  114.     case 1:
  115.         if ( a > 6 && m >= r2 ) M += 2;
  116.         break;
  117.     case 2:
  118.     case 4:
  119.     case 6:
  120.         M++;
  121.         break;
  122.     }
  123.     return M;
  124. }
  125.  
  126. # function to convert year/month/day into julian day number
  127. function jdn(year,month,day) {
  128.     local yr;
  129.     local pfac = 0.6;
  130.     local ljdn;
  131.  
  132.     yr = year + (month - 3.0) / 12.0;
  133.     ljdn = int(367.0 * yr + pfac) - (2 * int(yr)) + int(yr/4.0)
  134.        + int(day) + 1721117;
  135.     if ( !greg_jul ) ljdn += -int(yr/100.0) + int(yr/400.0) + 2;
  136.     return ljdn;
  137. }
  138.  
  139. #  function to convert julian dday number to year/month/day
  140. function caln(cjdn) {
  141.     local n, ic, np, npp, mp;
  142.     local yr, mo, day;
  143.     local dte; # dte[1] == year, dte[2] == month, dte[3] == day
  144.  
  145.     n = int(cjdn) - 1721119;
  146.     ic = int((n - 0.2)/36524.25);
  147.     if ( greg_jul ) np = n + 2; else np = n + ic - (ic / 4);
  148.     yr = int((np - 0.2)/365.25);
  149.     npp = np - int(365.25 * yr);
  150.     mp = int((npp - 0.5)/30.6);
  151.     day = int(npp + 0.5 - 30.6 * mp);
  152.     if ( mp <= 9 ) mo = mp + 3;
  153.       else {
  154.     yr++;
  155.     mo = mp - 9;
  156.     }
  157.     dte[1] = yr;
  158.     dte[2] = mo;
  159.     dte[3] = day;
  160.     return dte;
  161. }
  162.