############################################################################### # globals that this file expects the main program to define: # $Query # $Debug # $Now # $MyCCC # %UserDir # $ConfFile # $Style # $LibrarianDesc # $LibrarianAddr # $UseSection ############################################################################### ############################################################################### # directory table ############################################################################### %UserDir = ( 5401 => '/public/web/vsd/doc_archive', 5440 => '/public/web/vsd/vps/doc_archive', 5447 => '/public/web/vsd/fmd/doc_archive', 5510 => '/public/web/sass/doc_archive' , 5511 => '/public/web/astro/doc_archive' , 5514 => '/public/web/modsim/doc_archive' ); ############################################################################### # read config file ############################################################################### sub ReadConf { my $error = ''; if (!defined($UserDir{$MyCCC})) { $error = ("No UserDir defined for CCC $MyCCC"); return($error); } if (!open(CONF, "<" . "$UserDir{$MyCCC}/$ConfFile")) { $error = ("Cannot open file \"$UserDir{$MyCCC}/$file\": $!"); return($error); } while () { chomp; $Style = $1, next if (/^\s*Style\s*=\s*(.*)$/); $LibrarianDesc = $1, next if (/^\s*LibrarianDesc\s*=\s*(.*)$/); $LibrarianAddr = $1, next if (/^\s*LibrarianAddr\s*=\s*(.*)$/); $UseSection = $1, next if (/^\s*UseSection\s*=\s*(.*)$/); } close(CONF); return($error); } ############################################################################### # start page ############################################################################### sub Header { my $title = shift; print($Query->header); print($Query->start_html(-title => $title, -style => {'src' => $Style})); print < $title    EOF } ############################################################################### # end page ############################################################################### sub Tailer { # show debug info if ($Debug) { print('
'); beginPanel('header'); print('Debug Information'); midPanel('data'); debugPrint(); endPanel(); } print($Query->end_html); } ############################################################################### # draw panels ############################################################################### sub beginPanel { my $class = shift; print < EOF } sub midPanel { my $class = shift; print < EOF } sub endPanel { print < EOF } ############################################################################### # echo contents of a file ############################################################################### sub cat { my $file = shift; if (! open(FILE, "<$file")) { htmlError("Cannot open file \"$file\"!", "open() failed: $!"); return; } while() { print; } close(FILE); } ############################################################################### # print an error message in HTML ############################################################################### sub htmlError { my $mesg = shift; my $detail = shift; print('
'); beginPanel('header'); print("Error: $mesg"); midPanel('data'); print('Detailed message:
'); print("$detail
"); print('
'); if ($ENV{SERVER_ADMIN}) { print("Please contact this server's " . "web administrator."); } else { print("Please contact this server's web administrator."); } endPanel(); $Debug = 1; } ############################################################################### # print a warning message in HTML ############################################################################### sub htmlWarning { my $mesg = shift; my $detail = shift; print('
'); beginPanel('header'); print("Error: $mesg"); midPanel('data'); print("$detail"); endPanel(); } ############################################################################### # print query and environment info ############################################################################### sub debugPrint { my $key; print('Query:'); print('
'); foreach $key (sort($Query->param)) { print("$key = '" . $Query->param($key) . "'"); print('
'); } print('
'); print('Environment:'); print('
'); foreach $key (sort(keys(%ENV))) { print("$key = " . $ENV{$key}); print('
'); } print('
'); } ############################################################################### # return seconds elapsed since epoch ############################################################################### sub ftime { use POSIX; my $ticks = sysconf(&POSIX::_SC_CLK_TCK); my @timeb = POSIX::times(); return(time()) if ($ticks == 0); return($timeb[0] / $ticks); } ############################################################################### # return 1 if year (assumed to in canonical form) is a leap year, 0 otherwise ############################################################################### sub isLeapYear { my $year = shift; return(1) if (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0); return(0); } ############################################################################### # if date is valid, canonicalize it and return 1 # return 0 otherwise # # valid dates: # year: [4-digit] or 2-digit number # month: 1-digit or [2-digit] number, 1-12 # day: 1-digit or [2-digit] number, 1-31 # the form in [square braces] is the canonical form that is output ############################################################################### sub isValidDate { my $year = shift; my $month = shift; my $day = shift; return(0) unless (defined($$day) && $$day =~ /^\d\d?$/); return(0) unless (defined($$month) && $$month =~ /^\d\d?$/); return(0) unless (defined($$year) && ($$year =~ /^\d\d$/ || $$year =~ /^\d\d\d\d$/)); # Y2K: fix 2-digit years if ($$year =~ /^\d\d$/) { # Aerospace was founded in 1960 if ($$year >= 60) { $$year += 1900; } else { $$year += 2000; } } return(0) if ($$day < 1 || $$day > 31); return(0) if (($$month == 9 || $$month == 4 || $$month == 6 || $$month == 11) && $$day > 30); if ($$month == 2) { return(0) if ($$day > 29 && isLeapYear($$year)); return(0) if ($$day > 28); } $$month = "0$$month" if ($$month =~ /^\d$/); $$day = "0$$day" if ($$day =~ /^\d$/); return(1); } ############################################################################### # convert date (yyyy/mm/dd or yy/mm/dd) to age in days # return age, or -1 on error ############################################################################### sub dateToAge { use Time::Local; my $date = shift; my ($offset, $year, $mon, $day); $age = -1; if ($date =~ m|^(\d+)/(\d+)/(\d+)$|) { ($year, $mon, $day) = ($1, $2, $3); if (isValidDate(\$year, \$mon, \$day)) { # timelocal() expects offsets from 1900, but only works for # years >= 1970 $year -= 1900; $offset = 0; if ($year < 70) { $offset = ($year - 70)*86400*365; $year = 70; } # timelocal() expects months 0-11 $mon -= 1; $age = $offset + timelocal(0, 0, 0, $day, $mon, $year); $age = $Now - $age; $age /= 86400.0; $age = int(0.5 + $age); } } return($age); } ############################################################################### # true return value to satisfy require() ############################################################################### 1;