#!/usr/common/bin/perl

use Time::Local;

sub calendar {
	my ($year)= @_;
	my $i;
	my $weekday= day_of_the_week(1,0,$year);

	for ($i= 0; $i < 12; $i++) {
		$weekday= print_month($i, $year, $weekday);
		print "\n" if $i < 11;
	}
}

sub print_month {
	my ($month, $year, $weekday)= @_;
	my $n;
	my $day;

	print (("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")[$month]);
	print " $year\nSU MO TU WE TH FR SA\n";
	for ($n= 0; $n < $weekday; $n++) {
		print '   ';
	}
	for ($day= 1; $day <= number_of_days($month,$year); $day++) {
		print ' ' if $day < 10;
		print "$day ";
		$weekday= ($weekday + 1) % 7;
		print "\n" if $weekday == 0;
	}
	print "\n" if $weekday != 0;
	return $weekday;
}

sub number_of_days {
	my ($month, $year)= @_;

	if ($month == 1) { # February
		if (leap_year($year)) {
			return 29;
		} else {
			return 28;
		}
	} elsif ($month == 3 or $month == 5 or $month == 8 or $month == 10) {
		return 30;
	} else {
		return 31;
	}
}

sub leap_year {
	my ($year)= @_;

	return ($year % 4 == 0 and not $year % 100 == 0
             or $year % 400 == 0);
}

sub day_of_the_week {
	my ($day, $month, $year)= @_;

	return (localtime(timelocal(0,0,0,$day,$month,$year-1900)))[6];
}

if (@ARGV) {
	#die "Sorry, I don't handle years before 1900\a\n"
	#if $ARGV[0] < 1900;
	calendar($ARGV[0]);
} else {
	calendar(1900+(localtime)[5]);
}
