# see http://www.fsf.org/copyleft/gpl.html for a copy of the license
sub contents() {
+ my $nres = 0;
my ($cgi) = @_;
print "Extremely blunt ends-with search results:<br><pre>";
# only thing implemented yet: ends-with search
my $kw = lc $cgi->param("keywords");
- $kw = reverse $kw;
-
- # exact filename searching follows trivially:
- my $exact = $cgi->param("exact");
- $kw = "/$kw" if $exact;
+ # full filename search is tricky
+ my $ffn = $cgi->param("fullfilename");
+ $ffn = $ffn ? 1 : 0;
+
-# FIXME: ensure $suite is sanitized
- my $suite = 'stable';
+my $suite = 'stable'; #fixme
+ # fixme: I should open $reverses only once per search
my $reverses = tie my %reverses, 'DB_File', "$DBDIR/contents/reverse_$suite.db",
O_RDONLY, 0666, $DB_BTREE
or die "Failed opening reverse DB: $!";
-
+
+ if ($ffn) {
+ open FILENAMES, "$DBDIR/contents/filenames_$suite.txt"
+ or die "Failed opening filename table";
+ while (<FILENAMES>) {
+ next if index($_, $kw)<0;
+ chomp;
+ last unless &dosearch(reverse($_)."/", \$nres, $reverses);
+ }
+ close FILENAMES;
+ } else {
+
+ $kw = reverse $kw;
+
+ # exact filename searching follows trivially:
+ my $exact = $cgi->param("exact");
+ $kw = "$kw/" if $exact;
+
+ print "ERROR: Exact and fullfilenamesearch don't go along" if $ffn and $exact;
+
+ &dosearch($kw, \$nres, $reverses);
+ }
+ print "</pre>$nres results displayed";
+ $reverses = undef;
+ untie %reverses;
+
+}
+
+sub dosearch
+{
+ my ($kw, $nres, $reverses) = @_;
+
my ($key, $rest) = ($kw, "");
- my $nres = 0;
for (my $status = $reverses->seq($key, $value, R_CURSOR);
$status == 0;
$status = $reverses->seq( $key, $value, R_NEXT)) {
@hits = split /\0/o, $value;
print reverse($key)." is found in @hits\n";
- last if $nres++ > 100;
+ last if ($$nres)++ > 100;
}
- $reverses = undef;
- untie %reverses;
- print "</pre>$nres results displayed";
+ return $$nres<100;
}
1;