#!/usr/local/bin/perl binmode STDOUT; sub floor { local($_) = int($_[0]); $_ + ($_[0] >= $_ ? 0 : -1); } sub ordinal { local($number) = $_[0]; if ($number % 10 == 1 && $number % 100 != 11) { $number . 'st'; } elsif ($number % 10 == 2 && $number % 100 != 12) { $number . 'nd'; } elsif ($number % 10 == 3 && $number % 100 != 13) { $number . 'rd'; } else { $number . 'th'; } } # get parameters if ($ENV{'REQUEST_METHOD'} eq 'POST') { sysread(STDIN, $args, $ENV{'CONTENT_LENGTH'}); } else { $args = $ENV{'QUERY_STRING'}; } foreach (split('&', $args)) { ($key, $value) = split('=', $_, 2); $value =~ tr/+/ /; $value =~ s/%(..)/pack('C', hex($1))/ge; $param{$key} = $value; } $year = $param{'year'}; # print header print "Content-Type: text/html; charset=utf-8\n\n"; if ($ENV{'REQUEST_METHOD'} eq 'HEAD') { exit 0; } print '', "\n\n\nCalendar of the year $year\n\n", "\n\n
\n

Calendar of the year $year

\n
\n
\n"; if ($year <= 0 || $year ne int($year)) { print "Error: invalid year - $year
\nYears must be positive integers.
\n\n"; exit 0; } # nengo if (open(FILE, 'nengo.dat')) { while () { chop; ($start, $end, $eng, $jpn, $pron) = split(',', $_); if ($pron ne '' && $year >= $start && $year <= $end) { push(@japan, join('', 'The ', &ordinal($year - $start + 1), ' year of ', $eng, "
\n")); } } close(FILE); } # shoguns if (open(FILE, 'shogun.dat')) { while () { chop; ($start, $end, $order, $gmnt, $eng, $jpn, $pron) = split(',', $_); $eng =~ s/([A-Z])([A-Z\-]+)/$1$2<\/SMALL>/; if ($pron ne '' && $year >= $start && $year <= $end) { push(@japan, join('', 'The ', &ordinal($year - $start + 1), ' year of ', $eng, ', ', &ordinal($order), ' shogun of the ', $gmnt, " Government
\n")); } } close(FILE); } # emperors of Japan if (open(FILE, 'emperor.dat')) { while () { chop; ($start, $end, $order, $eng, $jpn, $pron, $empress, $dynasty) = split(',', $_); if ($year >= $start && $year <= $end) { push(@japan, join('', 'The ', &ordinal($year - $start + 1), ' year of ', $empress || 'Emperor', ' ', $eng, ', ', &ordinal($order), ' emperor of ', $dynasty || 'Japan', "
\n")); } } close(FILE); } # china nengo if (open(FILE, 'china.dat')) { while () { chop; ($start, $end, $eng, $jpn, $pron) = split(',', $_); if ($pron ne '' && $year >= $start && $year <= $end) { push(@china, join('', 'The ', &ordinal($year - $start + 1), ' year of ', $eng, "
\n")); } } close(FILE); } # elements and animals @elements = ('Jiă', 'Yĭ', 'Bĭng', 'Dīng', 'Wù', 'Jĭ', 'Gēng', 'Xīn', 'Rén', 'Guĭ'); @animals = ('Zĭ', 'Chŏu', 'Yín', 'Măo', 'Chén', 'Sì', 'Wŭ', 'Wèi', 'Shēn', 'Yŏu', 'Xū', 'Hài'); @elements2 = ('Yang, Wood', 'Yin, Wood', 'Yang, Fire', 'Yin, Fire', 'Yang, Earth', 'Yin, Earth', 'Yang, Metal', 'Yin, Metal', 'Yang, Water', 'Yin, Water'); @animals2 = ('Rat', 'Ox', 'Tiger', 'Rabbit', 'Dragon', 'Snake', 'Horse', 'Sheep', 'Monkey', 'Chicken', 'Dog', 'Boar'); push(@china, join('', 'The year of ', $elements[&floor($year - 1864) % 10], ' ', $animals[&floor($year - 1864) % 12], ' (', $elements2[&floor($year - 1864) % 10], ', ', $animals2[&floor($year - 1864) % 12], ")
\n")); # presidents of the U.S. if (open(FILE, 'pusa.dat')) { while () { chop; ($start, $end, $order, $name) = split(',', $_); if ($name ne '' && $year >= $start && $year <= $end) { push(@usa, join('', 'The ', &ordinal($year - $start + 1), ' year of ', $name, ', ', &ordinal($order), " president of the U.S.
\n")); } } close(FILE); } # rulers of Great Britain if (open(FILE, 'britain.dat')) { while () { chop; ($start, $end, $order, $name, $houseorder, $house, $queen, $land) = split(',', $_); if ($name ne '' && $year >= $start && $year <= $end) { push(@uk, join('', 'The ', &ordinal($year - $start + 1), ' year of ', $queen || 'King', ' ', $name, ', ', &ordinal($order), ' ruler of ', $land || 'England', ', ', &ordinal($houseorder), ' ruler of the ', $house, "
\n")); } } close(FILE); } print "
\n"; if (@japan) { print "
Japan:\n
"; foreach (@japan) { print; } print "
\n"; } if (@china) { print "
China:\n
"; foreach (@china) { print; } print "
\n"; } if (@usa) { print "
the United States of America:\n
"; foreach (@usa) { print; } print "
\n"; } if (@uk) { print "
Great Britain:\n
"; foreach (@uk) { print; } print "
\n"; } print "
\n"; print "
\n"; $totalleap = int(($year - 1) / 4) - int(($year - 1) / 100) + int(($year - 1) / 400); $leap = (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0); $weekday = ($year + $totalleap) % 7; @monthdays = (31, ($leap ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); @monthnames = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); for ($month = 1; $month <= 12; $month++) { $monthday = $monthdays[$month - 1]; $monthname = $monthnames[$month - 1]; print "$monthname
\n", "\n", ''; print "
Sun', 'MonTueWed', 'ThuFri', 'Sat'; for ($day = 1; $day <= $monthday; $day++) { if ($weekday == 0 || $day == 1) { print '
" if $weekday; } if ($weekday == 0) { print '', $day, ''; } elsif ($weekday == 6) { print '', $day, ''; } else { print '', $day, ''; } $weekday = ($weekday + 1) % 7; } print "
\n
\n"; } print "
\n", '


', 'Go to the previous year
', "\n", 'Go to the next year
', "\n", 'Return to the input form
', "\n", '
Copyright(C) TAKASUGI Shinji ', '(tssf.airnet.ne.jp)
', "\n\n\n"; exit 0;