#!/usr/athena/bin/perl -w

if (-f "/mit/sipb/share/rolodex/rolodex.lib") {
    @lists = ("/mit/sipb/share/rolodex/rolodex.lib");
} else {
    @lists = ("/afs/sipb.mit.edu/project/sipb/share/rolodex/rolodex.lib");
}
$p = $ENV{'HOME'} . "/.rolodex";
unshift(@lists, $p) if -r $p;
$areacode = "617";

print "Content-Type: text/html\n\n";
print "<!doctype html public \"-//IETF//DTD HTML 2.0//EN\">\n";
print "<html>\n<head>\n";
print "<title>Rolodex Output</title>\n";
print "</head>\n<body>\n";
print "<h1>Rolodex Output</h1>\n";

if ($ARGV[0] eq "-a")
{
    $print_all = 1;
    shift(@ARGV);
}
else
{
    $print_all = 0;
}

if (scalar(@ARGV) == 0)
{
    print "Enter a name or telephone number to look up.\n";
    print "<isindex prompt=\"Search string: \">\n";
    print "<address><strong>SIPB Webmasters</strong>";
    print "\&lt;<a href=\"/help/before-you-mail.html\">webmaster\@mit.edu</a>\&gt;</address>\n";
    print "</body>\n</html>\n";
    exit;
}

if ($ARGV[0] eq ".")				# trap regexp matching of "."
{
    print "Results of <code>rolodex</code> lookup of <code>$ARGV[0]</code>:\n";
    print "<pre>\n";
    print "</pre>\n";
    print "<isindex prompt=\"Search string: \">\n";
    print "<address><strong>SIPB Webmasters</strong>";
    print "\&lt;<a href=\"/help/before-you-mail.html\">webmaster\@mit.edu</a>\&gt;</address>\n";
    print "</body>\n</html>\n";
    exit;
}

print "Results of <code>rolodex</code> lookup of <code>$ARGV[0]</code>:\n";
print "<pre>\n";

if (scalar(@ARGV) == 1)
{
    $src = &parse_number($ARGV[0]);
    if ("$src")
    {
	for $list (@lists)
	{
	    open( LIST, $list ) || die "couldn't open file $list: $!\n";
	    while( <LIST> )
	    {
		last if /^---/;
		next if /^#/;
		(($num, $name) = /^\s*(\S+)\s+(.+)$/) || next;
		$name =~ s/\s*#.*$//;
		$name =~ s/\[([^]]*)\]/$1/g;
		if ($src eq &parse_number($num))
		{
		    print &unparse_number($src) . "  $name\n";
		    print "</pre>\n";
		    print "<isindex prompt=\"Search string: \">\n";
		    print "<address><strong>SIPB Webmasters</strong>";
		    print "\&lt;<a href=\"/help/before-you-mail.html\">webmaster\@mit.edu</a>\&gt;</address>\n";
		    print "</body>\n</html>\n";
		    exit;
		}
	    }
	    while( <LIST> )
	    {
		next if /^#/;
		(($num, $name) = /^\s*(\S+)\s+(.+)$/) || next;
		print &unparse_number($src) . "  $name\n" if $src =~ /^$num$/;
	    }
	}
    print "</pre>\n";
    print "<isindex prompt=\"Search string: \">\n";
    print "<address><strong>SIPB Webmasters</strong>";
    print "\&lt;<a href=\"/help/before-you-mail.html\">webmaster\@mit.edu</a>\&gt;</address>\n";
    print "</body>\n</html>\n";
    exit;
    }
}
$src = join(' ',@ARGV);
for $list (@lists)
{
    open( LIST, $list ) || die "couldn't open file $list: $!\n";
    while( <LIST> )
    {
	chop;
	last if /^---/;
	next if /^#/;
	s/\s*#\s*/#/g;
	(($num, $name, $k, $keys) = /^\s*(\S+)\s+([^#]+)(#(.*))?$/) || next;
	$k = $k; # don't warn about this variable...
	($subname = $name) =~ s/ ?\[[^]]*\]//g;
	$name =~ s/\[([^]]*)\]/$1/g;
	if ($subname =~ /$src/i)
	{
	    print &reparse_number($num) . "  $name\n";
	    next;
	}
	if ($print_all && $name =~ /$src/i)
	{
	    print &reparse_number($num) . "  $name\n";
	    next;
	}
	defined $keys && grep(/$src/, split(/#/,$keys))
        && (print &reparse_number($num) . "  $name\n");
    }
}
print "</pre>\n";
print "<isindex prompt=\"Search string: \">\n";
print "<address><strong>SIPB Webmasters</strong>";
print "\&lt;<a href=\"/help/before-you-mail.html\">webmaster\@mit.edu</a>\&gt;</address>\n";
print "</body>\n</html>\n";
exit;


sub parse_number
{
    local( $_ ) = @_;
    return "$areacode-25$1-$2" if /^([238])-?(\d{4})$/;
    return "$areacode-225-$1" if /^5-?(\d{4})$/;
    return "$areacode-$1-$2" if /^(\d{3})-?(\d{4})$/;
    return "$1-$2-$3" if /^(\d{3})-?(\d{3})-?(\d{4})$/;
    return "$1-$2-$3" if /^\((\d{3})\)-?(\d{3})-?(\d{4})$/;
    return $_ if /^[0-9-]*$/;
    return "";
}

sub unparse_number
{
    local( $_ ) = @_;
    return "     x$1" if /^$areacode-22(5-[156789]\d{3})$/;
    return "     x$1" if /^$areacode-25([3]-\d{4})$/;
    return "     x$1" if /^$areacode-25(2-[1567]\d{3})$/;
    return "     x$1" if /^$areacode-25(8-[056789]\d{3})$/;
    return "    $1" if /^$areacode-(\d{3}-\d{4})$/;
    return " " x (12-length) . $_;
}

sub reparse_number
{
    local( $_ ) = @_;
    return "     x5-$3" if /^(($areacode-?)?22)?5-?([156789]\d{3})$/;
    return "     x2-$3" if /^(($areacode-?)?25)?2-?([1567]\d{3})$/;
    return "     x$3-$4" if /^(($areacode-?)?25)?([3])-?(\d{4})$/;
    return "     x8-$3" if /^(($areacode-?)?25)?8-?([056789]\d{3})$/;
    return "    $2-$3" if /^($areacode-?)?(\d{3})-?(\d{4})$/;
    return " " x (12-length) . $_;
}
