Eric Raymond's open-source collection
I'm one of the few full-time open-source hackers. I was one of the
original GNU contributors back in 1982-83, and I've been at it ever
since. I'm not one of these who thinks commercial software is morally
wrong, I just like the open-source way better -- it's more fun and
produces better tools.
This directory contains sources for standalone open-source packages I
have either originated or now maintain. I used to call it my `free
software' collection. I don't anymore, for good reasons I have explained elsewhere.
All of this stuff is Unix sources unless explicitly noted otherwise.
Binary RPMs are i386 with glibc6 unless otherwise specified.
If you get good use out of my software, and you need high-quality
Linux hardware, see the good folks at VA Linux Systems, and tell them Eric
sent you. They occasionally throw resources
at me that help my projects, and are generally active in
supporting open-source development and the Linux community.
Communications and Internet
This is a full-featured, robust and very configurable
POP2/POP3/APOP/IMAP mail forwarder. It's designed to pick up mail
from a mail server host and deliver it just as though it had arrived
on your client machine via SMTP. You can download sources or RPMs
here, or browse the FAQ.
This is a nifty little HTML authoring tool that will generate correct
Netscape-style WIDTH and HEIGHT parameters for each of your IMG tags on
an HTML page. This will allow the text portions of the page to load
much faster. Requires that you have either identify(1) or a recent
file(1) and rdjpegcom(1) installed. The RPM is architecture-independent.
The archiver's assistant, an interactive Perl program for maintaining
large source archives accessible via FTP and WWW. The "new look" web
Metalab were all generated using keeper. Keeper enormously speeds
up the tasks of processing new files out of the incoming directory,
moving files around within the archive, and rearranging archive categories.
A little Perl script that makes a site map (HTML index page) from all
HTML pages with META DESCRIPTION tags below the current directory. To
see what the output looks like, browse
my site map. The RPM is architecture-independent.
A Python script that allows you to monitor remote web pages and FTP
directories, watching for new packages and downloading them when needed.
Designed to be run from cron, so you can have your updates
automatically downloaded in the wee hours of the morning. The
RPM is architecture-independent.
Note: harvester used to be called rpmwatcher, but I changed the name
because I intend to teach it how to handle Debian packages and
tarballs. If you have a ~/.rpmwatcher, just move it to ~/.harvester
and all will be well.
Implementing compilers for languages no one else is insane enough to touch with
a ten-foot pole is a hobby of mine. Here are some of the sickest jokes in the
history of language design --- one intentional, the others unintentional. Both
include documentation and chrestomathies of code in their source languages.
The most perverse language of all time. I didn't design INTERCAL, nor did I
write the classic and hilarious manual included here, but I revived the
language with this compiler, which also features the first implementation of
COME FROM with malice aforethought. It works by generating and then compiling
C. Requires lex or flex and either bison or yacc.
This weekend hack is a modern implementation of IEEE 1154-1991, the standard
for the PILOT language. The design of PILOT is horrifyingly bad, and the
PILOT standard hardly an exemplar of good practice, but this implementation
was fun and includes some tricks that may be of interest to serious compiler
writers. Most notably, it is both an interpreter for PILOT and a
PILOT compiler. Requires lex and yacc.
Another hideous old design, CUPL -- Cornell University Programming Language.
It looks something like a really archaic BASIC with linear-algebra builtins.
I reverse-engineered this interpreter from the manual, written in 1966; the
language-description parts of the manual are included in the docs. In 1.1
I added support for CUPL's immediate ancestor language, CORC. If you
want to know what programming was like before interactive time-sharing,
build this and find out. Requires either lex or flex, and bison or yacc.
If this sort of thing interests you, I keep other intriguingly
horrible languages at the
My utility for displaying alternate names and notations of a given
ASCII character, sort of an interactive reference chart. Also handy
as a quick base converter for byte values.
My handy little tool for internationalization. Extracts string constants from
C sources and generates in constant names, prepending an appropriate set of
#defines to the C source. Good support for incrementally trying out
conversions until you get what you want.
Everybody's favorite stupid utility, a hex dumper. This one
mimics CP/M's and MS/DOS's dump format, either options to do lots of
other semi-interesting things. Unusual of its kind in that it handles
EBCDIC (I needed this capability once for reasons I've mercifully
forgotten). Now with internationalization.
A conversion script that takes SCCS version histories and maps them into
RCS histories (change comments included). Requires the sccs(1) utility
supported under BSD and SVr4, also csh. I didn't write this, but I fixed
some portability bugs in it and added a useful option.
This is the fast, small sed originally distributed in the GNU toolkit and
still distributed with Minix. The GNU people ditched it when they built
their own sed around an enhanced regexp package -- but it's still better
for some uses (in particular, faster and less memory-intensive).
Once upon a time, I decided I needed to understand the System V
semaphore features. I wrote this exerciser to help me. Use it
to learn, or as a semaphore access method for shellscripts.
All this program does is read keystrokes and spit them back at you in
a simple, printable form. This is one of these silly little utilities
that you never think you'll need until some unexpected situation pops
up and you have to have it. Then you get to be mugged by the details
of tty-interface code, yippee. Never again! Runs under SV, Linux.
My package for YACC parser encapsulation. Permits multiple YACC
parsers in a single program.
My speaker device driver for 386/486 boxes --- permits you to play
tunes on a PC-clone console speaker under UNIX. An older version
was included with the NetHack distribution. This one has (untested)
portability patches contributed by people who ported 1.3 to 386bsd
Games I've Written
My clone of Christian Franz's nifty little Macintosh game. Find the
lifeboats adrift in interstellar space. Now with mouse support if
you're using ncurses under xterm.
A piece of retrocomputing archeology --- my exact clone of the
classic Hunt The Wumpus game, exactly as it first appeared in 1972.
Also includes an original but strangely similar game, superhack.
Games I've Hacked On
I often hack on existing games to improve them. Here's a selection of my
favorites, customized in various ways.
A full-featured X laboratory for the game of Life. This version
has many features added since 3.0. Not least of these is my support
for up to 8-state automata with arbitrary, editable transition tables
and color used to display the states. Includes extensive pattern
libraries for both Life and the Codd 8-state automaton.
My rewrite, with vastly improved screen interface, of Bruce
Holloway's Battleships game. Not a very interesting game at that,
the optimal strategy is too obvious --- I just couldn't stand to leave
the interface as mal-designed as it was.
My rewrite for ncurses of Tim Lister's enjoyable little Blue Moon solitaire.
Has much better screen support. If you have a sufficiently recent version of
ncurses on an Intel box, it will even display the IBM card-suit glyphs.
This is Chuck Simmons's C translations of VMS FORTRAN Empire, a solitaire
version. Nobody seems to be maintaining it any more. I've colorized it and
updated it for ANSI/POSIX C. This version works with Linux ncurses.
I added color support and some polish to Matt Day's game. He
dropped out of sight, so I maintain it.
This game was originally Quentin Neill's UNIX port of an Amiga tetris.
I colorized it and cleaned up some portability problems. This version
works with Linux ncurses.
A little program that computes tables of non-replacement probabilities
(as in, card draws from a Magic: The Gathering deck). The mathematical
guts are from Jeremy York's `cardprobs', but this has a vastly improved
interface and (gasp!) documentation. Version 2.0 adds more capabilities.
I designed and wrote this. It's not a game, exactly. More like a
consciousness-raising exercise --- or, if you like, an insidious and
vile piece of partisan political propaganda :-).
The volks-hypertext browser for the Jargon File, written by Ray Gardner
and myself. Install this with the File for easy on-line browsing of
your authoritative guide to Internet and USENET jargon. Also useful
for hypertextifying other lexicons and documents. You can also browse the
Jargon File via
X Video Explorer, help for people trying to configure video timings
for XFree86. You'll need the Hitchhiker's Guide To X386 Video Timing to use
this. It's pretty obsolete; use kvideogen instead.
I wrote this to rebind console keyboard mappings under SVr3.2; it's
similar to Linux loadkeys. It's probably obsolete now, but there is
some lex trickery in it that may make it of some interest to people
building things like loadkeys or modmap.
This program helps you find letter mnemonics for phone numbers by filtering
them for pronounceability. Typically, it gives you only the best few hundred
of nineteen-thousand-odd possibilities.
A tool for cleaning up files transferred from MS-DOS; it can strip CRs,
remove trailing ^Z characters, etc. With an option, it will put in CRs
for files that need to go in the other direction. It can also strip
meta bits, in case your file was a WordStar document. Finally, it can
do appropriate filename mapping.
A set of modem-management tools, written in Expect, for the Livingston
Portmaster terminal server. What these help you do is gang-program
the modems, or gang-dump their register settings for comparison. One
of them, pmpersist, can be used while your PM is active; it keeps looping
through your list of modems re-programming idle ones until all have
been touched. These tools can handle multiple modem types.
Other peoples' software
I have a lot of stuff in Emacs, including the VC mode that front-ends
for RCS/SCCS/CVS and the Grand Unified Debugger mode that lets you
drive GNU gdb and other symbolic debuggers from within
Emacs. According to RMS's credit list, I appear to have more Emacs
Lisp code in the standard Emacs distribution than anyone else but
I have contributed substantial code and documentation to the standard
environment of the Python
language. The post-1.5.1 versions of the standard
sendmail.py, and multifile.py
modules have my work in them. I wrote shlex.py
and netrc.py outright. I have also contributed to the Python Image
I've contributed to GNOME. The NETLoad applet code was mine; I also
taught gnome-card how to do categories, and added the Super-Safe option
to gnobots and gnobotsII.
Packages I No Longer Maintain
If you're looking for GIFLIB, it's now maintained by
Eric S. Raymond <email@example.com>