`` Written by D. Sureau in Scriptol
`` from a public domain C source.
`` I can't garantee all dates are rights...
`` www.scriptol.org - Public domain.
constant int ISO_CAL = 0
array days = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
array daynames = array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
array months = array("January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December")
void usage()
print "Usage: cal month year"
print "where: month 1 - 12"
print " year 1 - 99 or 1800 - 3000"
exit(-1)
return
boolean isLeap(int yr)
boolean x = (yr mod 400) = 0
boolean y = (yr mod 4) = 0
boolean z = (yr mod 100) <> 0
return x or (y and z)
int monthsToDays(int month)
return (month * 3057 - 3007) / 100
int yearsToDays(int yr)
return (yr * 365) + (yr / 4) - (yr / 100) + (yr / 400)
int scalarFromYMD(int yr, int mo, int day)
int scalar
scalar = day + monthsToDays(mo)
if mo > 2 // adjust if past February
if isLeap(yr)
scalar - 1
else
scalar - 2
/if
/if
scalar + yearsToDays(yr - 1)
return scalar
int today()
int y, m, d
dict x = localtime()
y = x["tm_year"]
m = x["tm_mon"]
d = x["tm_mday"]
return scalarFromYMD(y + 1900, m + 1, d)
int, int, int scalarToYMD(int scalar)
int n = int( ((scalar * 400) / 146097) )
while yearsToDays(n) < scalar
n + 1
/while
int yr = n
n = int(scalar - yearsToDays(n - 1))
if n > 59
n + 2
if isLeap(yr)
if n > 62
n - 1
else
n - 2
/if
/if
/if
int mo = ((n * 100) + 3007) / 3057
int day = n - monthsToDays(mo)
return yr, mo, day
int main(int argc, array argv)
int day, firstDay, numdays
int i, j
int yr, mo, dy
int thisMonth, thisYear, thisDay
thisYear, thisMonth, thisDay = scalarToYMD(today())
if argc not in 1..3 let usage()
`` The month, or the month and the year may be given,
`` the default is the current month at start.
if argc
= 3:
yr = argv[2].toInt()
mo = argv[1].toInt()
= 2:
if argv[1] in ("?", "/h", "-?", "-h", "--help") let usage()
mo = argv[1].toInt()
yr, i, j = scalarToYMD(today())
else
yr, mo, dy = scalarToYMD(today())
/if
if not (mo in 1..12) let usage()
if yr < 100 let yr + 2000
if yr not in 1800..3000 let usage()
for i in 0 .. 2
if mo < 1
mo = 12
yr - 1
/if
if mo > 12
mo = 1
yr + 1
/if
numdays = days[mo - 1]
`` each 4 years february is 29 days long
if (mo = 2) and isLeap(yr)
numdays + 1
/if
firstDay = scalarFromYMD(yr, mo - 1, 1) + 1
firstDay = int(firstDay) mod 7
print
for j in 0 .. 6
echo daynames[j], ' '
/for
echo " |--- ", months[mo - 1], ", ", yr, "\n"
` adjust starting day in table
for day in 0 .. firstDay echo " "
day = 0
while day < numdays
day + 1
firstDay + 1
firstDay = firstDay mod 7
if (firstDay = 0) and (day <> 0) print
if day < 10 echo ' '
if (thisDay = day) and (thisMonth = mo) and (thisYear = yr)
echo '[', day, ']'
else
echo ' ', day, ' '
/if
/while
mo + 1
print
/for
return 0
main($argc, $argv)