+ end() if main->can('end');
+}
+
+total() if main->can('total');
+exit 0;
+
+sub process
+{
+ my $line = shift;
+ chomp $line;
+ push @prev, $line;
+ shift @prev while @prev > $nolines;
+ my $flag = 0;
+ foreach my $p (@patt) {
+ if ($p =~ /^!/) {
+ my $r = substr $p, 1;
+ last if $line =~ m{$r}i;
+ } else {
+ last unless $line =~ m{$p}i;
+ }
+ ++$flag;
+ }
+ if ($flag == @patt) {
+ for (@prev) {
+ s/([\x00-\x1f\x7f-\xff])/sprintf("\\x%02X", ord($1))/eg;
+ my ($t, $l) = split /\^/, $_, 2;
+ print atime($t), ' ', $l, "\n";
+ }
+ print "------------------\n" if $nolines > 1;
+ @prev = ();
+ }
+}
+
+sub usage
+{
+ print << "XXX";
+
+ usage: grepdbg [nn days before] [-nnn lines before] [<perl file name>] [<regexp>|!<regexp>]...
+
+ You can have more than one <regexp> with an implicit 'and' between them. All
+ <regexes> are caseless. It's recommended to put 'not' (!<regex>) first in any list.
+ Don't forget that you are doing this in a shell and you may need to quote your
+ <regex>s.
+
+ grepdbg with no arguments will simply list the current debug log with the timestamp
+ for each line decoded into a human readable form.
+
+ grepdbg | less
+
+ is a handy way of scrolling through the debug log.
+
+ You can install your own content and display arrangement (useful for filtering data
+ in some complicated way). You call it like this (assuming it is called 'filter.pm').
+
+ grepdbg filter.pm
+
+ All the other arguments to grepdbg are available to limit the input to your filter.
+ If you want them.
+
+ The filter module MUST contain at least:
+
+ package main;
+
+ sub handle
+ {
+ your code goes here
+ }
+ 1;
+
+ It can also have a 'sub begin {...}' and / or 'sub end {...}' which are executed
+ immediately after opening a logfile and then just before closing it, respectively.
+
+ You can also add a 'sub total {...}' which executes after the last line is
+ printed and grepdbg exits.
+
+ Read the code of this program and copy'n'paste the 'sub process' code and change
+ its name to 'sub handle'. Modify it to your requirements...
+
+XXX