summaryrefslogtreecommitdiff
path: root/biblio/bibtex/utils/lookbibtex/lookbibtex.dist
diff options
context:
space:
mode:
Diffstat (limited to 'biblio/bibtex/utils/lookbibtex/lookbibtex.dist')
-rw-r--r--biblio/bibtex/utils/lookbibtex/lookbibtex.dist220
1 files changed, 220 insertions, 0 deletions
diff --git a/biblio/bibtex/utils/lookbibtex/lookbibtex.dist b/biblio/bibtex/utils/lookbibtex/lookbibtex.dist
new file mode 100644
index 0000000000..4f0b008d07
--- /dev/null
+++ b/biblio/bibtex/utils/lookbibtex/lookbibtex.dist
@@ -0,0 +1,220 @@
+#!/usr/dist/bin/perl
+
+#
+# lookbibtex 1.22
+# Look in to a bib file.
+# Comments to <johnh@cs.ucla.edu>.
+#
+# Copyright (C) 1990 by John Heidemann
+# This is distributed under the GNU Public Licence, Version 1 (Feb 89).
+# See the Perl documentation for a copy of that license.
+#
+# 4-Oct-90 it is hacked together.
+# 19-Nov-90 Now it remembers "'s and join such lines.
+# It also removes nasty characters like {} from the search string.
+# 20-Nov-90 Umlaut accents handled correctly.
+# 28-Nov-90 A simple heuristic to handle multi-line fields with {}'s is added.
+# In addition, we compress all whitespace to single spaces in the
+# searched version. lookbibtex 1.1
+# 4-Jan-91 Converted the -k option to -f, since field makes more sense than
+# keyword. lookbibtex 1.11
+# 17-Jan-91 Added -s option to pass through strings, instead of ignoring them.
+# 31-May-91 ficus directory moved
+# 26-Aug-91 Documentation fixed. The environment variable LOOKBIBTEXFILE
+# will set the default bibtex file to use.
+# lookbibtex 1.12 released, posted to anonymous ftp at cs.ucla.edu.
+# 28-Aug-91 Usage string fixed at suggestion of
+# Henk P. Penning <henkp@cs.ruu.nl>.
+# 5-Sep-91 Argument processing re-done (now matches grep, as it always
+# should have). Changes from Tim Wilson <tdw@cl.cam.ac.uk> to
+# handle multiple bib files and select default bib files from BIBINPUTS.
+# lookbibtex 1.2
+# 29-Jan-92 Bug reported by Dana Jacobsen <jacobsd@frisby.cs.orst.edu>:
+# "badkeys" are handled in a case sensitive manner. Fixed.
+# lookbibtex 1.21
+# 25-Feb-92 Sigh. Bug fixes always make more bugs. Bug in last fix, fixed.
+# lookbibtex 1.22
+#
+# This program relies on the convention that the closing } of a
+# bib entry is the only } in the first non-whitespace column,
+# and that the opening @ is also there.
+#
+
+
+
+$* = 1; # make searches on vars with imbedded newlines work
+$prog = substr($0,rindex($0,'/')+1);
+
+
+$badkeys = "string"; # keys to ignore (list in lowercase only)
+
+
+#
+# do argument processing
+#
+
+@files = (); # files to search
+$passthroughbad = 0; # -s flag
+undef ($pattern); # will be set below
+undef ($keyword); # may be set below
+
+sub remember_file {
+ local ($file) = @_;
+ local ($dev, $ino) = stat ($file);
+ local ($key) = "$dev,$ino";
+ if (!defined($files{$key})) {
+ $files{$key} = $file;
+ push (@files, $file);
+
+ };
+# warn ("file $file ($key) remembered.\n");
+};
+
+while ($#ARGV >= 0) {
+ if ($ARGV[0] eq "-s") {
+ $passthroughbad = 1;
+ } elsif ($ARGV[0] eq "-f" && $#ARGV >= 1) {
+ $keyword = $ARGV[1];
+ shift (@ARGV);
+ } elsif (defined($pattern)) {
+ &remember_file ($ARGV[0]);
+ } else {
+ $pattern = $ARGV[0];
+ };
+ shift (@ARGV);
+};
+
+if (!defined($pattern)) {
+ die ("Usage: $prog [-s] [-f field] regexp [bibfile.bib ...]\n" .
+ " Fields restricts the regexp search to that bibtex " .
+ "field entry (author, etc.)\n" .
+ " Default bibfile is $defaultfile, - indicates stdin.\n" .
+ " Regexp is a Perl regexp.\n");
+};
+
+#
+# handle the keyword by modifying the pattern
+#
+if (defined($keyword)) {
+ $pattern = "^\\s*${keyword}\\s*=.*${pattern}";
+# print "pattern is $pattern\n";
+};
+
+#
+# Handle choosing default bib files:
+# Select anything from BIBINPUTS.
+#
+if ($#files == -1) {
+ $searchpath = ($ENV{'BIBINPUTS'} || ".");
+ foreach $dir (split(/:/, $searchpath)) {
+ opendir(DIR, $dir) || do {
+ warn "$prog: Can't open directory `$dir', skipping\n";
+ next;
+ };
+ foreach $file (grep(/\.bib$/, readdir(DIR))) {
+ &remember_file ($dir . "/" . $file);
+ };
+ closedir(DIR);
+ };
+};
+
+die ("$prog: no files on command line or in BIBINPUTS\n") if ($#files == -1);
+
+$manyfiles = ($#files > 0); # remember if to show filenames or not
+
+
+
+#
+# Certain keys we really want to ignore because
+# they're not bib entries. They're listed here.
+#
+@badkeys = split(/,/, $badkeys);
+foreach $i (@badkeys) {
+ $badkeys{$i} = "bad"; # just make them defined
+};
+
+
+
+#
+# To do searches right, we have to make everything
+# for a field on one line.
+# This routine does that, and also gets rid of {}'s
+# which tend to get in the way for searches. In the
+# same vein, it collapses all whitespace to single spaces.
+#
+# To know when to join lines, we use two simple heuristics:
+# is there are a odd number of "'s on a line, we must enter or exit
+# multi-line mode. If there are more {'s than }'s, we must enter,
+# and if there are more }'s than {'s we must exit (anything on
+# the first line is ignored).
+#
+
+sub printtosearch {
+ local ($print) = @_;
+ local ($search, $mode) = ("", 1);
+ local ($opencurley, $closecurley) = (0,0);
+
+ @lines = split(/\n/, $print);
+ @lines[0] =~ s/{/ /;
+ foreach $ln (@lines) {
+ # remove and count curley brackets
+ $opencurley = ($ln =~ s/[{]//g);
+ $closecurley = ($ln =~ s/[}]//g);
+ if ($opencurley-$closecurley < 0) {
+ $mode = 1;
+ } elsif ($opencurley-$closecurley > 0) {
+ $mode = 0;
+ } else {
+ # remove umlauts so quote handling works,
+ # and then change modes if required.
+ $ln =~ s/\\"//g;
+ $mode = !$mode if (($ln =~ tr/"/"/) % 2 == 1);
+ };
+ $search .= $ln;
+ $search .= "\n" if ($mode);
+ };
+ $search =~ s/[ \t]+/ /g;
+ return $search;
+}
+
+
+#
+# looking for beginning of bib entry is state 1, in bib is state 2
+#
+$LOOKING = 1; $INBIB = 2;
+
+foreach $file (@files) {
+ open (INF, "<$file") || warn ("cannot open bibfile $file\n");
+ $state = $LOOKING;
+
+ while (<INF>) {
+# print "line ", $i++, " state=$state: " . "$_\n";
+ # beware RCS munging $state:...$
+ if ($state == $LOOKING) {
+ if (/^[ \t]*@(\w+)/) { # beginning of entry
+ ($key = $1) =~ tr/A-Z/a-z/;
+ # case insensitive keywords
+ if (! defined($badkeys{$key})) {
+ $state = $INBIB;
+ $bibentry = $_;
+ } elsif ($passthroughbad) {
+ print "$_"; # a hack for @string
+ };
+ };
+ } elsif ($state == $INBIB) {
+ $bibentry .= $_;
+ if (/^[ \t]*}/) { # ending
+ $searchentry = &printtosearch($bibentry);
+ if ($searchentry =~ /$pattern/i) {
+ print "$file:\n" if ($manyfiles);
+ print "$bibentry\n";
+ };
+ $state = $LOOKING;
+ }
+ } else {
+ die ("state problem, $state\n");
+ };
+ };
+};
+
+