#!/usr/local/bin/perl

# Dieses Programm soll dem Sekretariat des Rechnerbetriebs dazu
# dienen, schnell nachzuschauen, ob bestimmte Usernamen bereits
# vergeben sind und ob bestimmte Personen bereits einen Bereich haben.

# time finger roman: 5.490u 7.800s 1:30.16 14.7% 0+136k 3+0io 2pf+0w
# Anderthalb Minuten für finger sind keine akzeptable Wartezeit.

# Die ganze 400 KB lange Usertabelle wird zwecks schnelleren Zugriffs
# in den Speicher geladen und gehasht.


while (($name, $passwd, $uid, $gid, $quota, $comment, 
	$gcos, $dir, $shell) = getpwent)
{

    $dir = "~$name" unless $dir =~ m:/$name$:;
    $gcos =~ s/&/\u$name/; $gcos =~ s/[, ]*$//;

    next if $user{$name} =~ /^[^:]/;
    $user{$name} = "$dir -> $gcos$user{$name}";

    foreach $keyword (split (/[^A-Za-z0-9]+/, "\L$gcos"))
    {
	$user{$keyword} .= ":$name" unless $keyword eq $name;
    }

    print "\rMemorized ", ++$users, " "; $|=1;
}

endpwent; print "users in ", time - $^T, " seconds.\n";

while ($_ = shift || <STDIN>)
{
    foreach $keyword (split (/[^a-z0-9]+/, "\L$_"))
    {
	($this, @others) = split (/:/, $user {$keyword});

	$this = $this || "$keyword ?";

	print "\e[7m$this\e[m\n";

	foreach (@others)
	{
	    $_ = $user{$_}; s/:.*//; print "$_\n";
	}
    }
}

exit;
