home *** CD-ROM | disk | FTP | other *** search
- #
- # QTAwk utility for computing dates of holidays.
- #
- BEGIN {
- # gregorian/julian calender
- # TRUE == julian calender
- greg_jul = FALSE;
- month_array[ 1] = "January";
- month_array[ 2] = "Febuary";
- month_array[ 3] = "March";
- month_array[ 4] = "April";
- month_array[ 5] = "May";
- month_array[ 6] = "June";
- month_array[ 7] = "July";
- month_array[ 8] = "August";
- month_array[ 9] = "September";
- month_array[10] = "October";
- month_array[11] = "November";
- month_array[12] = "December";
- week_day[0] = "Sunday";
- week_day[1] = "Monday";
- week_day[2] = "Tuesday";
- week_day[3] = "Wednesday";
- week_day[4] = "Thursday";
- week_day[5] = "Friday";
- week_day[6] = "Saturday";
- # month of pass-over
- psm = 3;
- leader = copies(" ",20) ∩ ": ";
- }
-
- # /^{_w}*{_d}(4,4}({_w}|$)/ {
- {
- dates($1);
- printf("\nHolidays for %4u\n",$1);
- holiday = overlay(leader,"Purim",1);
- printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[purim[2]],week_day[purim[0]],purim[2],purim[3],purim[1]);
-
- holiday = overlay(leader,"Pass Over",1);
- 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]);
-
- holiday = overlay(leader,"Shavuot",1);
- printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[shavuot[2]],week_day[shavuot[0]],shavuot[2],shavuot[3],shavuot[1]);
-
- holiday = overlay(leader,"Rosh Hashana",1);
- 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]);
-
- holiday = overlay(leader,"Yom Kippur",1);
- 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]);
-
- holiday = overlay(leader,"Sukkot",1);
- printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[sukkot[2]],week_day[sukkot[0]],sukkot[2],sukkot[3],sukkot[1]);
-
- holiday = overlay(leader,"Simchat Torah",1);
- 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]);
-
- holiday = overlay(leader,"Hanukkah",1);
- printf("%s %s - %s, %02u/%02u/%02u\n",holiday,month_array[hanukkah[2]],week_day[hanukkah[0]],hanukkah[2],hanukkah[3],hanukkah[1]);
- }
-
- function dates(year) {
- local M1, M2, ha, rh, day;
-
- M1 = pass_over_day(year);
- M2 = pass_over_day(year + 1);
- ha = (M2 - M1) % 5 ? -1 : 0;
- greg_jul = TRUE;
- pass_over = jdn(year,psm,M1);
- greg_jul = FALSE;
- day = pass_over + 50;
- shavuot = caln(day);
- shavout[0] = (day + 1) % 7;
- rh = pass_over + 163;
- rosh_hashana = caln(rh);
- rosh_hashana[0] = (day + 1) % 7;
- day = pass_over + 172;
- yom_kippur = caln(day);
- yom_kippur[0] = (day + 1) % 7;
- day = pass_over + 247 + ha;
- hanukkah = caln(day);
- hanukkah[0] = (day + 1) % 7;
- day = pass_over - 30;
- purim = caln(day);
- purim[0] = (day + 1) % 7;
- day = rh + 14;
- sukkot = caln(day);
- sukkot[0] = (day + 1) % 7;
- day = rh + 22;
- simchat_torah = caln(day);
- simchat_torah[0] = (day + 1) % 7;
- day = pass_over;
- pass_over = caln(day);
- pass_over[0] = (day + 1) % 7;
- }
-
- function pass_over_day(year) {
- local r1 = 23269.0/25920;
- local r2 = 1367.0/2160;
- local r3 = 272953.0/492480;
- local r4 = 4343.0/98496;
- local A, a, b, N, M, M1, C;
-
- A = year + 3760;
- a = (12*A + 17) % 19;
- b = A % 4;
- N= (1 + r3)*a + b/4.0 + 32 + r4 - A/315.0;
- M = int(N);
- m = fract(N);
- C = (3*A + 5*b + M + 5) % 7;
- switch ( C ) {
- case 0:
- if ( a > 11 && m >= r1 ) M++;
- break;
- case 1:
- if ( a > 6 && m >= r2 ) M += 2;
- break;
- case 2:
- case 4:
- case 6:
- M++;
- break;
- }
- return M;
- }
-
- # function to convert year/month/day into julian day number
- function jdn(year,month,day) {
- local yr;
- local pfac = 0.6;
- local ljdn;
-
- yr = year + (month - 3.0) / 12.0;
- ljdn = int(367.0 * yr + pfac) - (2 * int(yr)) + int(yr/4.0)
- + int(day) + 1721117;
- if ( !greg_jul ) ljdn += -int(yr/100.0) + int(yr/400.0) + 2;
- return ljdn;
- }
-
- # function to convert julian dday number to year/month/day
- function caln(cjdn) {
- local n, ic, np, npp, mp;
- local yr, mo, day;
- local dte; # dte[1] == year, dte[2] == month, dte[3] == day
-
- n = int(cjdn) - 1721119;
- ic = int((n - 0.2)/36524.25);
- if ( greg_jul ) np = n + 2; else np = n + ic - (ic / 4);
- yr = int((np - 0.2)/365.25);
- npp = np - int(365.25 * yr);
- mp = int((npp - 0.5)/30.6);
- day = int(npp + 0.5 - 30.6 * mp);
- if ( mp <= 9 ) mo = mp + 3;
- else {
- yr++;
- mo = mp - 9;
- }
- dte[1] = yr;
- dte[2] = mo;
- dte[3] = day;
- return dte;
- }
-