home *** CD-ROM | disk | FTP | other *** search
- # Print a calendar for the specified month, highlighting today's date.
- # Based on algorithms published in Computer Language magazine,
- # December, 1990. Used with permission.
-
- proc day(jdate)
- # Calculate the day of the month corresponding to a Julian day number.
- local a, b, c, d, e, z, alpha
- @ z = jdate + 1
- # Cope with the Gregorian calendar reform.
- if (z < 2299161) then
- @ a = z
- else
- @ alpha = (z - 1867216.25)//36524.25
- @ a = z + 1 + alpha - alpha//4
- end
- @ b = a + 1524
- @ c = (b - 122.1)//365.25
- @ d = floor(365.25 * c)
- @ e = (b - d)//30.6001
- return b - d - floor(30.6001 * e)
- end
-
- proc dayofweek(jdate)
- return (jdate + 2) % 7
- end
-
- proc calendar(month, year)
- # Print a calendar for the specified month
- local b_date, e_date, c_date, day, c_day, c_month, c_year, Month, week
- local m, d, y, i, today
- set Month = January February March April May June ^
- July August September October November December
- set dt = `dt`
- set m = $dt:1
- set d = $dt:2
- set y = $dt:3
- for i = 0 to 11 do
- if (m == substr(Month[i], 1, 3)) break
- end
- @ m = i + 1
- @ today = `julian $m $d $y`
- if (year == '') then
- @ year = y
- if (month == '') @ month = m
- end
- if (month !~ '[0-9]*') then
- @ m = "$lower(month)*"
- for i = 0 to 11 do
- if (lower(Month[i]) =~ m) break
- end
- @ month = i + 1
- end
- # Calculate Julian day numbers for the first and last days of the month
- if ((b_date = julian(month, 1, year)) == -1) return
- @ e_date = (month < 12 ? ^
- julian(month + 1, 1, year) : ^
- julian(1, 1, year == -1 ? 1 : year + 1)) - 1
- echo $Month[month - 1] $year
- @ week = "^r^nSun Mon Tue Wed Thu Fri Sat^r^n"
- # Put the first day of the month under the correct day column
- for i = 0 to day = dayofweek(b_date) - 1 do
- @ week = concat(week, " ")
- end
- # Print all the days
- @ i = 1
- if (b_date == 2299156) then
- # In October 1582, the Julian calendar was replaced with the
- # Gregorian calendar and Oct 4 was immediately followed by Oct 15
- # by decree of Pope Gregory XIII. However, be aware that Britain
- # did not adopt the Gregorian calendar until Sept 2, 1752 (which
- # was followed by Sept 14.) This routine prints a calendar according
- # to Pope Gregory's decree.
- for c_date = b_date to e_date do
- @ week = concat(week, printf("%3d ", i++))
- if (i == 5) @ i = 15
- if (c_date != e_date && ++day % 7 == 6) @ week = concat(week, "^r^n")
- end
- else
- for c_date = b_date to e_date do
- @ week = (today == c_date) ? ^
- concat(week, ansi("bright yellow"), ^
- printf("%3d ", i++), ansi()) : ^
- concat(week, printf("%3d ", i++))
- if (c_date != e_date && ++day % 7 == 6) @ week = concat(week, "^r^n")
- end
- end
- calc week
- echo
- end
-
- calendar $argv
-