#!/opt/bin/perl

###############################################################################
##                                                                           ##
##    Copyright (c) 1998 by Steffen Beyer.                                   ##
##    All rights reserved.                                                   ##
##                                                                           ##
##    This program is free software; you can redistribute it                 ##
##    and/or modify it under the same terms as Perl itself.                  ##
##                                                                           ##
###############################################################################

# Usage: pgrep [-i|-l|-v|-ilv] perlregexp [files]

$self = $0;
$self =~ s!^.*/!!;

$ignore_case = 0;
$list_filenames = 0;
$invert_result = 0;

while (@ARGV)
{
    if (substr($ARGV[0],0,1) eq '-')
    {
        $_ = shift;
        if (/^-[ilv]+$/)
        {
            if (/i/) { $ignore_case = 1; }
            if (/l/) { $list_filenames = 1; }
            if (/v/) { $invert_result = 1; }
        }
        else { die "$self: unknown option '$_' encountered!\n"; }
    }
    else { last; }
}

unless (@ARGV)
{
    die "Usage: $self [-i|-l|-v|-ilv] perlregexp [files]\n";
}

$reg_exp = shift;

$_ = '';
eval { /$reg_exp/o };
if ($@)
{
    if ($@ =~ /^(.+?)\s+at\s/) { die "$self: $1!\n"; }
    else                       { die "$self: $@"; }
}

push(@ARGV, '-') unless (@ARGV);

FILE:
while (@ARGV)
{
    $file = shift;
    if ($file eq '-')
    {
        undef @ARGV;
        $list_filenames = 0;
    }
    else
    {
        unless (-f $file)
        {
            warn "$self: file '$file' does not exist!\n";
            next FILE;
        }
    }
    unless (open(FH, "<$file"))
    {
        warn "$self: unable to open file '$file': $!\n";
        next FILE;
    }
    if ($invert_result)
    {
        if ($ignore_case)
        {
            while (<FH>)
            {
                unless (/$reg_exp/io)
                {
                    if ($list_filenames) { print "$file\n"; close(FH); next FILE; }
                    else { if ($file eq '-') { print; } else { print "$file:$_"; } }
                }
            }
        }
        else
        {
            while (<FH>)
            {
                unless (/$reg_exp/o)
                {
                    if ($list_filenames) { print "$file\n"; close(FH); next FILE; }
                    else { if ($file eq '-') { print; } else { print "$file:$_"; } }
                }
            }
        }
    }
    else
    {
        if ($ignore_case)
        {
            while (<FH>)
            {
                if (/$reg_exp/io)
                {
                    if ($list_filenames) { print "$file\n"; close(FH); next FILE; }
                    else { if ($file eq '-') { print; } else { print "$file:$_"; } }
                }
            }
        }
        else
        {
            while (<FH>)
            {
                if (/$reg_exp/o)
                {
                    if ($list_filenames) { print "$file\n"; close(FH); next FILE; }
                    else { if ($file eq '-') { print; } else { print "$file:$_"; } }
                }
            }
        }
    }
    close(FH);
}

__END__

