1 | /* cal.mod - print an ASCII calendar of the given year */ |
---|
2 | |
---|
3 | /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ |
---|
4 | |
---|
5 | param year, integer, >= 0001, <= 3999, default 2010; |
---|
6 | |
---|
7 | param first_day{m in 1..12}, integer, >= 0, <= 6, := |
---|
8 | time2str(str2time(year & "-" & m & "-01", "%Y-%m-%d"), "%w"); |
---|
9 | |
---|
10 | param days_in_month{m in 1..12}, integer, >= 28, <= 31, := |
---|
11 | (str2time(year + (if m < 12 then 0 else 1) & "-" & |
---|
12 | (if m < 12 then m+1 else 1) & "-01", "%Y-%m-%d") - |
---|
13 | str2time(year & "-" & m & "-01", "%Y-%m-%d")) / 86400; |
---|
14 | |
---|
15 | param foo{m in 1..12, k in 0..5, d in 0..6}, integer, := |
---|
16 | 7 * k + d + 1 - first_day[m]; |
---|
17 | |
---|
18 | param cal{m in 1..12, k in 0..5, d in 0..6}, integer, := |
---|
19 | if 1 <= foo[m,k,d] and foo[m,k,d] <= days_in_month[m] then |
---|
20 | foo[m,k,d]; |
---|
21 | |
---|
22 | printf "\n"; |
---|
23 | printf "%33s%04d\n", "", year; |
---|
24 | printf "\n"; |
---|
25 | for {t in 1..12 by 3} |
---|
26 | { for {m in t..t+2} |
---|
27 | { printf "%7s%-14s", "", time2str(str2time(m, "%m"), "%B"); |
---|
28 | printf{0..0: m < t+2} " "; |
---|
29 | } |
---|
30 | printf "\n"; |
---|
31 | for {m in t..t+2} |
---|
32 | { printf " S M Tu W Th F S"; |
---|
33 | printf{0..0: m < t+2} " "; |
---|
34 | } |
---|
35 | printf "\n"; |
---|
36 | for {k in 0..5} |
---|
37 | { for {m in t..t+2} |
---|
38 | { for {d in 0..6} |
---|
39 | { printf{0..0: cal[m,k,d] = 0} " "; |
---|
40 | printf{0..0: cal[m,k,d] != 0} " %2d", cal[m,k,d]; |
---|
41 | } |
---|
42 | printf{0..0: m < t+2} " "; |
---|
43 | } |
---|
44 | printf "\n"; |
---|
45 | } |
---|
46 | } |
---|
47 | printf "\n"; |
---|
48 | |
---|
49 | end; |
---|