alpar@1: /* cal.mod - print an ASCII calendar of the given year */ alpar@1: alpar@1: /* Written in GNU MathProg by Andrew Makhorin */ alpar@1: alpar@1: param year, integer, >= 0001, <= 3999, default 2010; alpar@1: alpar@1: param first_day{m in 1..12}, integer, >= 0, <= 6, := alpar@1: time2str(str2time(year & "-" & m & "-01", "%Y-%m-%d"), "%w"); alpar@1: alpar@1: param days_in_month{m in 1..12}, integer, >= 28, <= 31, := alpar@1: (str2time(year + (if m < 12 then 0 else 1) & "-" & alpar@1: (if m < 12 then m+1 else 1) & "-01", "%Y-%m-%d") - alpar@1: str2time(year & "-" & m & "-01", "%Y-%m-%d")) / 86400; alpar@1: alpar@1: param foo{m in 1..12, k in 0..5, d in 0..6}, integer, := alpar@1: 7 * k + d + 1 - first_day[m]; alpar@1: alpar@1: param cal{m in 1..12, k in 0..5, d in 0..6}, integer, := alpar@1: if 1 <= foo[m,k,d] and foo[m,k,d] <= days_in_month[m] then alpar@1: foo[m,k,d]; alpar@1: alpar@1: printf "\n"; alpar@1: printf "%33s%04d\n", "", year; alpar@1: printf "\n"; alpar@1: for {t in 1..12 by 3} alpar@1: { for {m in t..t+2} alpar@1: { printf "%7s%-14s", "", time2str(str2time(m, "%m"), "%B"); alpar@1: printf{0..0: m < t+2} " "; alpar@1: } alpar@1: printf "\n"; alpar@1: for {m in t..t+2} alpar@1: { printf " S M Tu W Th F S"; alpar@1: printf{0..0: m < t+2} " "; alpar@1: } alpar@1: printf "\n"; alpar@1: for {k in 0..5} alpar@1: { for {m in t..t+2} alpar@1: { for {d in 0..6} alpar@1: { printf{0..0: cal[m,k,d] = 0} " "; alpar@1: printf{0..0: cal[m,k,d] != 0} " %2d", cal[m,k,d]; alpar@1: } alpar@1: printf{0..0: m < t+2} " "; alpar@1: } alpar@1: printf "\n"; alpar@1: } alpar@1: } alpar@1: printf "\n"; alpar@1: alpar@1: end;