home *** CD-ROM | disk | FTP | other *** search
- Path: wupost!usc!rutgers!rochester!ferguson
- From: ferguson@cs.rochester.edu (George Ferguson)
- Newsgroups: alt.sources
- Subject: Perl scripts for cleaning directory hierarchies
- Message-ID: <1991Aug26.172434.2573@cs.rochester.edu>
- Date: 26 Aug 91 17:24:34 GMT
- Reply-To: ferguson@cs.rochester.edu (George Ferguson)
- Distribution: alt
- Organization: University of Rochester Computer Science Dept.
- Lines: 620
-
- [ Apologies for the cancellation and repost if it got to you. I simply
- added some echo lines to the Makefile. ]
-
- The following shar provides three useful scripts for removing those
- Emacs backup files and all that LaTeX garbage. The "-n" option causes
- them to just print what would be deleted without doing it. There are
- also "-l" (long output) and "-t" (print totals). I swear by "-nvt" to
- see how much I can get back before cleaning.
-
- The script "clean-files" is a Perl script based on "find2perl"'s
- conversion of my previous find(1) scripts. The other three scripts
- are Bourne shell scripts that invoke clean-files with an appropriate
- pattern. Pedantic Perl hackers can no doubt do better -- be my guest.
-
- While I use these programs myself, I will not be held responsible for
- damage arising from your use of them. THEY DO DELETE FILES. You have
- been warned.
-
- The README is reproduced below:
-
- README for clean-files and related files
-
- George Ferguson, ferguson@cs.rochester.edu, 26 Aug 1991.
-
-
- This distribution includes the base program "clean-files" which is a
- Perl script for deleting files matching a given Perl expression (or
- doing some other things, see the man page). As applications of
- clean-files, the scripts "clean-emacs-files", "clean-tex-files", and
- "clean-obj-files" are included. These all just specify the
- appropriate expression and invoke clean-files. In particular,
- clean-tex-files illustrates how fairly complicated expressions can be
- used.
-
- Edit the Makefile to set BINDIR, MANDIR, and any variables as required
- for your site. Then "make install" will install the scripts, and
- "make install.man" will install the man pages. If your system does not
- understand #!, you will have to make a shell script wrapper for
- clean-files.
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 1)."
- # Contents: Makefile README clean-emacs-files clean-emacs-files.man
- # clean-files clean-files.man clean-obj-files clean-obj-files.man
- # clean-tex-files clean-tex-files.man
- # Wrapped by ferguson@swan.cs.rochester.edu on Mon Aug 26 13:22:39 1991
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'Makefile' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'Makefile'\"
- else
- echo shar: Extracting \"'Makefile'\" \(593 characters\)
- sed "s/^X//" >'Makefile' <<'END_OF_FILE'
- X#
- X# Makefile for clean-files and related files
- X#
- X# George Ferguson, ferguson@cs.rochester.edu, 23 Aug 1991.
- X#
- X
- XFILES=clean-files clean-emacs-files clean-tex-files clean-obj-files
- XBINDIR=/usr/bin
- XMANDIR=/usr/man/man1
- XMANEXT=1
- X
- XINSTALL=install
- XINSTPGMFLAGS=-c -m 0755
- XINSTMANFLAGS=-c -m 0644
- X
- Xall:
- X @echo 'Everything is up to date'
- X
- Xinstall:
- X @for f in $(FILES); \
- X do echo "installing $$f"; \
- X $(INSTALL) $(INSTPGMFLAGS) $$f $(BINDIR)/$$f; \
- X done
- X
- X
- Xinstall.man:
- X @for f in $(FILES); \
- X do echo "installing $$f.man"; \
- X $(INSTALL) $(INSTMANFLAGS) $$f.man $(MANDIR)/$$f.$(MANEXT); \
- X done
- END_OF_FILE
- if test 593 -ne `wc -c <'Makefile'`; then
- echo shar: \"'Makefile'\" unpacked with wrong size!
- fi
- # end of 'Makefile'
- fi
- if test -f 'README' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'README'\"
- else
- echo shar: Extracting \"'README'\" \(856 characters\)
- sed "s/^X//" >'README' <<'END_OF_FILE'
- X README for clean-files and related files
- X
- XGeorge Ferguson, ferguson@cs.rochester.edu, 26 Aug 1991.
- X
- X
- XThis distribution includes the base program "clean-files" which is a
- XPerl script for deleting files matching a given Perl expression (or
- Xdoing some other things, see the man page). As applications of
- Xclean-files, the scripts "clean-emacs-files", "clean-tex-files", and
- X"clean-obj-files" are included. These all just specify the
- Xappropriate expression and invoke clean-files. In particular,
- Xclean-tex-files illustrates how fairly complicated expressions can be
- Xused.
- X
- XEdit the Makefile to set BINDIR, MANDIR, and any variables as required
- Xfor your site. Then "make install" will install the scripts, and
- X"make install.man" will install the man pages. If your system does not
- Xunderstand #!, you will have to make a shell script wrapper for
- Xclean-files.
- X
- END_OF_FILE
- if test 856 -ne `wc -c <'README'`; then
- echo shar: \"'README'\" unpacked with wrong size!
- fi
- # end of 'README'
- fi
- if test -f 'clean-emacs-files' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-emacs-files'\"
- else
- echo shar: Extracting \"'clean-emacs-files'\" \(290 characters\)
- sed "s/^X//" >'clean-emacs-files' <<'END_OF_FILE'
- X#!/bin/sh
- X#
- X# clean-emacs-files: Invoke clean-files with an expression that selects
- X# files that end in "~" or start and end with "#".
- X#
- X# George Ferguson, ferguson@cs.rochester.edu, 23 Aug 1991.
- X#
- X
- XCLEAN_FILES_CALLER="$0"
- Xexport CLEAN_FILES_CALLER
- Xexec clean-files '/~$/ || /^#.*#$/' "$@"
- END_OF_FILE
- if test 290 -ne `wc -c <'clean-emacs-files'`; then
- echo shar: \"'clean-emacs-files'\" unpacked with wrong size!
- fi
- chmod +x 'clean-emacs-files'
- # end of 'clean-emacs-files'
- fi
- if test -f 'clean-emacs-files.man' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-emacs-files.man'\"
- else
- echo shar: Extracting \"'clean-emacs-files.man'\" \(1086 characters\)
- sed "s/^X//" >'clean-emacs-files.man' <<'END_OF_FILE'
- X.TH CLEAN-EMACS-FILES 1 "23 Aug 1991" "U of Rochester"
- X.SH NAME
- Xclean-emacs-files \- remove files that emacs leaves lying around
- X.SH SYNOPSIS
- X.I clean\-emacs\-files
- X[\fB\-nvlt\fP]
- X[\fIdirectory\fP]
- X.SH DESCRIPTION
- X.PP
- X.I Clean\-emacs\-files
- Xsearches the directory tree rooted at the given directory and deletes
- Xall files whose names end with a tilde ("~") (\fIemacs\fP backup
- Xfiles) or that start and end with a hash symbol ("#") (\fIemacs\fP autosave
- Xfiles). If no directory is given, the search is rooted at the current
- Xworking directory.
- X.SH OPTIONS
- X.PP
- X.IP \fB-n\fP
- XNo execute mode: The files are not removed. Implies \fB-v\fP if
- Xneither \fB-t\fP nor \fB-l\fP are given.
- X.IP \fB-v\fP
- XVerbose mode: Prints names of deleted files to stdout, one per line.
- X.IP \fB-l\fP
- XLong verbosity mode:
- XPrints "ls\ \-lig" information for each deleted file.
- X.IP \fB-t\fP
- XTotal mode: Prints the number of files and total bytes deleted to
- Xstdout when the search is completed.
- X.SH SEE ALSO
- X.PP
- Xemacs(1),
- Xclean\-files(1),
- Xfind(1),
- Xperl(1).
- X.SH AUTHOR
- X.PP
- XGeorge Ferguson (ferguson@cs.rochester.edu).
- X
- X
- END_OF_FILE
- if test 1086 -ne `wc -c <'clean-emacs-files.man'`; then
- echo shar: \"'clean-emacs-files.man'\" unpacked with wrong size!
- fi
- # end of 'clean-emacs-files.man'
- fi
- if test -f 'clean-files' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-files'\"
- else
- echo shar: Extracting \"'clean-files'\" \(4255 characters\)
- sed "s/^X//" >'clean-files' <<'END_OF_FILE'
- X#!/usr/staff/bin/perl
- X#
- X# clean-files : Removes files in a directory tree.
- X#
- X# The first argument must be a Perl expression that will identify
- X# the relevant files using $_ as the filename. The second argument,
- X# if given, is the directory to start the search in. The two arguments
- X# can be separated by any of the switches -n, -v, -t, and -l.
- X#
- X# This program underlies such programs as "clean-emacs-files",
- X# "clean-tex-files", and "clean-obj-files". See these for examples
- X# of how to specify complex patterns. Note that those programs should
- X# set the environment variable CLEAN_FILES_CALLER to get an appropriate
- X# usage message.
- X#
- X# George Ferguson, ferguson@cs.rochester.edu, 23 Aug 1991.
- X#
- X
- X# Load the library code that knows how to walk directory trees
- Xrequire "find.pl";
- X
- X# Set usage message
- Xif (($program=$ENV{'CLEAN_FILES_CALLER'}) ne "") {
- X $usage="usage: $program [-ntvl] [directory]\n";
- X} else {
- X $program=`basename $0`;
- X chop $program;
- X $usage="usage: $program pattern [-ntvl] [directory]\n";
- X}
- X
- X# The pattern has to be the first argument
- Xif ($#ARGV == -1)
- X { die "$usage"; }
- Xelse
- X { $pattern=$ARGV[0]; shift; }
- X
- X# Parse switches
- Xwhile ($_ = $ARGV[0], /^-/) {
- X shift;
- X last if /^--$/;
- X if (/n/) { $noexec = 1; }
- X if (/v/) { $verbose = 1; }
- X if (/t/) { $totals = 1; }
- X if (/l/) { $long = 1; }
- X if (/-.*[^ntvl]/) { die "$usage"; }
- X}
- X# Note that -n implies -v unless -V or -t was given
- Xif ($noexec && !$long && !$totals) {
- X $verbose = 1;
- X}
- X
- X# If we need to be very verbose, then set the translation arrays
- Xif ($long) {
- X @rwx = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
- X @moname = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
- X while (($name, $pw, $uid) = getpwent) {
- X $user{$uid} = $name unless $user{$uid};
- X }
- X while (($name, $pw, $gid) = getgrent) {
- X $group{$gid} = $name unless $group{$gid};
- X }
- X}
- X
- X# Now do the find, which calls &wanted for each file
- Xif ($#ARGV == -1)
- X { &find('.'); }
- Xelsif ($#ARGV == 0)
- X { &find($ARGV[0]); }
- Xelse
- X { die "$usage"; }
- X
- X# Print the totals if requested
- Xif ($totals) {
- X printf "$program: $numfiles files ($numbytes bytes) %sdeleted\n",
- X ($noexec ? "would be " : "");
- X}
- X
- X# Goodbye
- Xexit;
- X
- X# wanted: Called for each file. Filename is in $_, directory name in
- X# $dir (and we are switched to that directory), and full pathname in $name.
- Xsub wanted {
- X if (eval($pattern)) {
- X if ($verbose) {
- X print "$name\n";
- X }
- X if ($totals || $long) {
- X ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_);
- X if ($long) {
- X &ls;
- X }
- X if ($totals) {
- X $numfiles += 1;
- X $numbytes += $size;
- X }
- X }
- X if (!$noexec) {
- X unlink($_);
- X }
- X }
- X}
- X
- X# ls: Generated automatically by find2perl for the -ls option
- Xsub ls {
- X ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizemm,
- X $atime,$mtime,$ctime,$blksize,$blocks) = lstat(_);
- X
- X $pname = $name;
- X
- X if (defined $blocks) {
- X $blocks = int(($blocks + 1) / 2);
- X }
- X else {
- X $blocks = int(($size + 1023) / 1024);
- X }
- X
- X if (-f _) { $perms = '-'; }
- X elsif (-d _) { $perms = 'd'; }
- X elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; }
- X elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; }
- X elsif (-p _) { $perms = 'p'; }
- X elsif (-S _) { $perms = 's'; }
- X else { $perms = 'l'; $pname .= ' -> ' . readlink($_); }
- X
- X $tmpmode = $mode;
- X $tmp = $rwx[$tmpmode & 7];
- X $tmpmode >>= 3;
- X $tmp = $rwx[$tmpmode & 7] . $tmp;
- X $tmpmode >>= 3;
- X $tmp = $rwx[$tmpmode & 7] . $tmp;
- X substr($tmp,2,1) =~ tr/-x/Ss/ if -u _;
- X substr($tmp,5,1) =~ tr/-x/Ss/ if -g _;
- X substr($tmp,8,1) =~ tr/-x/Tt/ if -k _;
- X $perms .= $tmp;
- X
- X $user = $user{$uid} || $uid;
- X $group = $group{$gid} || $gid;
- X
- X ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
- X $moname = $moname[$mon];
- X if (-M _ > 365.25 / 2) {
- X $timeyear = '19' . $year;
- X }
- X else {
- X $timeyear = sprintf("%02d:%02d", $hour, $min);
- X }
- X
- X printf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n",
- X $ino,
- X $blocks,
- X $perms,
- X $nlink,
- X $user,
- X $group,
- X $sizemm,
- X $moname,
- X $mday,
- X $timeyear,
- X $pname;
- X 1;
- X}
- X
- Xsub sizemm {
- X sprintf("%3d, %3d", ($rdev >> 8) & 255, $rdev & 255);
- X}
- X
- END_OF_FILE
- if test 4255 -ne `wc -c <'clean-files'`; then
- echo shar: \"'clean-files'\" unpacked with wrong size!
- fi
- chmod +x 'clean-files'
- # end of 'clean-files'
- fi
- if test -f 'clean-files.man' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-files.man'\"
- else
- echo shar: Extracting \"'clean-files.man'\" \(1731 characters\)
- sed "s/^X//" >'clean-files.man' <<'END_OF_FILE'
- X.TH CLEAN-FILES 1 "23 Aug 1991" "U of Rochester"
- X.SH NAME
- Xclean-files \- remove files matching a pattern
- X.SH SYNOPSIS
- X.I clean\-files
- X\fIperl-expr\fP
- X[\fB\-nvlt\fP]
- X[\fIdirectory\fP]
- X.SH DESCRIPTION
- X.PP
- X.I Clean\-files
- Xsearches the directory tree rooted at the given directory and deletes
- Xall files whose names are recognized by the given
- X.IR perl-expr .
- XThis expression (see
- X.IR perl (1))
- Xshould test $_ and return true (non-zero) if the file named by it in
- Xthe current directory should be deleted. Note that
- X.IR perl 's
- Xdirectory searching routines put you in the file's directory before
- Xtesting the expression.
- XIf no directory is given, the search is rooted at the current
- Xworking directory.
- X.PP
- X.I Clean\-files
- Xis really meant to be used by other tools that specify appropriate
- Xpatterns for common removal chores. In this regard, see
- X.IR clean\-emacs\-files (1),
- X.IR clean\-tex-files (1),
- Xand
- X.IR clean\-obj\-files (1).
- X.I Clean\-files
- Xis significantly faster than equivalent
- X.IR find (1)
- Xcommands, primarily due to its builtin
- X.I unlink()
- Xfunction.
- X.SH OPTIONS
- X.PP
- X.IP \fB-n\fP
- XNo execute mode: The files are not removed. Implies \fB-v\fP if
- Xneither \fB-t\fP nor \fB-l\fP are given.
- X.IP \fB-v\fP
- XVerbose mode: Prints names of deleted files to stdout, one per line.
- X.IP \fB-l\fP
- XLong verbosity mode:
- XPrints "ls\ \-lig" information for each deleted file.
- X.IP \fB-t\fP
- XTotal mode: Prints the number of files and total bytes deleted to
- Xstdout when the search is completed.
- X.SH ENVIRONMENT
- X.IP CLEAN_FILES_CALLER
- XName of invoking program for usage message, if any.
- X.SH "SEE ALSO"
- X.PP
- Xclean\-emacs\-files(1),
- Xclean\-tex-files(1),
- Xclean\-obj\-files(1),
- Xfind(1),
- Xperl(1).
- X.SH AUTHOR
- X.PP
- XGeorge Ferguson (ferguson@cs.rochester.edu).
- X
- X
- END_OF_FILE
- if test 1731 -ne `wc -c <'clean-files.man'`; then
- echo shar: \"'clean-files.man'\" unpacked with wrong size!
- fi
- # end of 'clean-files.man'
- fi
- if test -f 'clean-obj-files' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-obj-files'\"
- else
- echo shar: Extracting \"'clean-obj-files'\" \(254 characters\)
- sed "s/^X//" >'clean-obj-files' <<'END_OF_FILE'
- X#!/bin/sh
- X#
- X# clean-objs-files: Invoke clean-files with an expression that selects
- X# files that end in ".o".
- X#
- X# George Ferguson, ferguson@cs.rochester.edu, 23 Aug 1991.
- X#
- X
- XCLEAN_FILES_CALLER="$0"
- Xexport CLEAN_FILES_CALLER
- Xexec clean-files '/\.o$/' "$@"
- END_OF_FILE
- if test 254 -ne `wc -c <'clean-obj-files'`; then
- echo shar: \"'clean-obj-files'\" unpacked with wrong size!
- fi
- chmod +x 'clean-obj-files'
- # end of 'clean-obj-files'
- fi
- if test -f 'clean-obj-files.man' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-obj-files.man'\"
- else
- echo shar: Extracting \"'clean-obj-files.man'\" \(937 characters\)
- sed "s/^X//" >'clean-obj-files.man' <<'END_OF_FILE'
- X.TH CLEAN-OBJ-FILES 1 "23 Aug 1991" "U of Rochester"
- X.SH NAME
- Xclean-obj-files \- remove object files
- X.SH SYNOPSIS
- X.I clean\-obj\-files
- X[\fB\-nvlt\fP]
- X[\fIdirectory\fP]
- X.SH DESCRIPTION
- X.PP
- X.I Clean\-obj\-files
- Xsearches the directory tree rooted at the given directory and deletes
- Xall files whose names end in ".o". If no directory is given, the
- Xsearch is rooted at the current working directory.
- X.SH OPTIONS
- X.PP
- X.IP \fB-n\fP
- XNo execute mode: The files are not removed. Implies \fB-v\fP if
- Xneither \fB-t\fP nor \fB-l\fP are given.
- X.IP \fB-v\fP
- XVerbose mode: Prints names of deleted files to stdout, one per line.
- X.IP \fB-l\fP
- XLong verbosity mode:
- XPrints "ls\ \-lig" information for each deleted file.
- X.IP \fB-t\fP
- XTotal mode: Prints the number of files and total bytes deleted to
- Xstdout when the search is completed.
- X.SH SEE ALSO
- X.PP
- Xcc(1),
- Xclean\-files(1),
- Xfind(1),
- Xperl(1).
- X.SH AUTHOR
- X.PP
- XGeorge Ferguson (ferguson@cs.rochester.edu).
- X
- X
- END_OF_FILE
- if test 937 -ne `wc -c <'clean-obj-files.man'`; then
- echo shar: \"'clean-obj-files.man'\" unpacked with wrong size!
- fi
- # end of 'clean-obj-files.man'
- fi
- if test -f 'clean-tex-files' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-tex-files'\"
- else
- echo shar: Extracting \"'clean-tex-files'\" \(429 characters\)
- sed "s/^X//" >'clean-tex-files' <<'END_OF_FILE'
- X#!/bin/sh
- X#
- X# clean-tex-files: Invoke clean-files with an expression that selects
- X# files that end in ".aux" or ".dvi", or those that end in ".log"
- X# for which there's a ".tex" file in the same directory.
- X#
- X# George Ferguson, ferguson@cs.rochester.edu, 23 Aug 1991.
- X#
- X
- XCLEAN_FILES_CALLER="$0"
- Xexport CLEAN_FILES_CALLER
- Xexec clean-files '/\.aux$/ || /\.dvi$/ ||
- X (/\.log$/ && ($tex=$_) && ($tex=~s/\.log$/.tex/) && -e $tex)' "$@"
- END_OF_FILE
- if test 429 -ne `wc -c <'clean-tex-files'`; then
- echo shar: \"'clean-tex-files'\" unpacked with wrong size!
- fi
- chmod +x 'clean-tex-files'
- # end of 'clean-tex-files'
- fi
- if test -f 'clean-tex-files.man' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'clean-tex-files.man'\"
- else
- echo shar: Extracting \"'clean-tex-files.man'\" \(1105 characters\)
- sed "s/^X//" >'clean-tex-files.man' <<'END_OF_FILE'
- X.TH CLEAN-TEX-FILES 1 "23 Aug 1991" "U of Rochester"
- X.SH NAME
- Xclean-tex-files \- remove files that TeX and LaTeX leave lying around
- X.SH SYNOPSIS
- X.I clean\-tex\-files
- X[\fB\-nvlt\fP]
- X[\fIdirectory\fP]
- X.SH DESCRIPTION
- X.PP
- X.I Clean\-tex\-files
- Xsearches the directory tree rooted at the given directory and deletes
- Xall files whose names end with ".aux", ".dvi", or ".log". Files ending
- Xin ".log" are only deleted if there is a corresponding ".tex" file in
- Xthe same directory. If no directory is given, the search is rooted at
- Xthe current working directory.
- X.SH OPTIONS
- X.PP
- X.IP \fB-n\fP
- XNo execute mode: The files are not removed. Implies \fB-v\fP if
- Xneither \fB-t\fP nor \fB-l\fP are given.
- X.IP \fB-v\fP
- XVerbose mode: Prints names of deleted files to stdout, one per line.
- X.IP \fB-l\fP
- XLong verbosity mode:
- XPrints "ls\ \-lig" information for each deleted file.
- X.IP \fB-t\fP
- XTotal mode: Prints the number of files and total bytes deleted to
- Xstdout when the search is completed.
- X.SH SEE ALSO
- X.PP
- Xtex(1),
- Xlatex(1),
- Xclean\-files(1),
- Xfind(1),
- Xperl(1).
- X.SH AUTHOR
- X.PP
- XGeorge Ferguson (ferguson@cs.rochester.edu).
- X
- X
- END_OF_FILE
- if test 1105 -ne `wc -c <'clean-tex-files.man'`; then
- echo shar: \"'clean-tex-files.man'\" unpacked with wrong size!
- fi
- # end of 'clean-tex-files.man'
- fi
- echo shar: End of archive 1 \(of 1\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have the archive.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
- --
- George Ferguson ARPA: ferguson@cs.rochester.edu
- University of Rochester UUCP: {decvax,rutgers}!rochester!ferguson
- Rochester NY 14627-0226 VOX: (716) 275-2527
-