For years before open source went mainstream, I was one of the few full-time open-source hackers. I was one of the original GNU contributors back in the mid-1980s, and I've been at it ever since.

This directory contains sources for standalone open-source packages I have either originated or now maintain.

All of this stuff is Unix sources unless explicitly noted otherwise.

Communications and Internet

gpsd

gpsd is a service daemon that monitors a GPS attached to a serial or USB port, decodes the position/velocity/time information it sends, and republishes in a simple uniform format on an IANA-designated TCP/IP port. This enables multiple applications to read from a GPS without contention. The distribution also provides C and Python libraries to encapsulate the client side of talking with gpsd.

cvssync

Shipped with rcs-fast-export, this a wrapper around rsync that can be used to mirror CVS repositories. It knows about the access conventions of important nosting sites.

sh-installkeys

A handy little Python tool for managing ssh credentials on remote sites. Copes with all the fiddly bits like getting permissions right.

shipper

A tool that builds on freecode-submit — an intelligent shipping agent that knows how to deliver software releases to both private channels such as your hosted website and public channels such as SourceForge and freecode.net.

freecode-submit

This is a tool for sending freecode version updates via XML-RPC. It is meant to be included in your project release scripts. (This used to be called "freshmeat-submit"; it changed its name when the site did.)

coverity-submit

This is a tool for shipping static-checking requests to the Coverity public server. Handles all the details of running the Coverity front-end tool. bundling up the analysis results, shipping them, and submitting a job card. Supports multiple projects.

giflib

The ubiquitous service library for rendering GIFs. I handed off the project 1994 to avoid problems with the U.S. patent system, but accepted back the lead in 2012. This code had the odd effect of making me virtually omnipresent; it seems nobody has ever bothered to write a replacement, and it's now ubiquitous in web browsers, cellphones and gaming consoles. In a nicely ironic touch, it earned me an appearance in the credits of the Microsoft XBox.

gif2png

This handy little converter turns GIF files into PNG files. With the distribution you get a Python script that can be used to convert an entire website, not only changing GIFs to PNGs but also patching HTML and PHP pages appropriately. GIFs no longer have dangerous patent problems, but PNG is still a better format.

sng

This tool enables you to decompile PNGs into an information-preserving .sng text format that you can hack with a text editor. Then you can recompile the .sng back to a .png — handy if you need to add or edit some obscure ancillary PNG chunk that your graphics tools don't understand. Also handy if you want to generate PNGs programmatically using text tools.

imgsizer

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. Requires Python.

sitemap

A little Python 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.

Defenestration Tools

lookout

This little Python script converts Outlook 97 addressbook export files to the KAB format used by KDE addressbooks. See the project page for details.

Documentation Tools

doclifter

They said it was impossible. They said I was mad! Well, they were right about the second part, but it really is possible to do automated conversion from troff markups like man, ms, and me to SGML/XML. BWAHAHAHA!

xmlif

xmlif is a tool that interprets certain processing instructions in XML documents to support conditional emission of specified sections of the document. It is intended to be used as a stage in an XML toolchain. Note: if you have Tim Waugh's xmlto(1) installed, you already have xmlif.

Useful Languages

CML2

I wrote a language for solving configuration problems. It has an embedded truth maintenance system and can handle a fairly rich constraint language.

Useless Languages

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.

INTERCAL

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.

pilot-1.8      (source)

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.

CUPL

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 Retrocomputing Museum.

MAD

This program is a work of reconstructive archeology, a compiler for the Michigan Algorithmic Decoder (MAD) language from 1962. It first translates MAD code into C, then uses the local C compiler to make an executable binary. You will need Python and David Beazley's PLY module installed to run it. A complete transcription of the 1962 MAD manual is included.

Programming Tools

deheader

deheader analyzes C and C++ files to determine which header inclusions can be removed while still allowing them to compile. This may result in substantial improvements in compilation time, especially on large C++ projects; it also sometimes exposes dependencies and cohesions of which developers were unaware.

reposurgeon

reposurgeon enables risky operations that version-control systems don't want to let you do, such as editing past comments and metadata and removing commits. It works with any version control system that can export and import git fast-import streams, including git and hg and bzr.

cvs-fast-export

rcs-fast-export assembles changesets from the per-file changes in a CVS repository and can either report on them for human eyes or ship the history as a git fast-import stream. Originally by Keith Packard around 2002; I took over in 2012, adding --fast-export mode and later a test suite.

rcs-fast-import

rcs-fast-import unpacks a git fast-import stream into an RCS file tree I wrote this as a prod at more recent and putatively more advanced version-control systems that don't have .fi importers yet. If crufty old RCS can import these streams, why can't yours?

ctopy

ctopy automates the parts of translating C source code to Python source code that are difficult for a human but easy for a machine. This allows a human programmer to concentrate on the nontrivial parts of the translation.

comparator

This program finds common code segments in large source trees very quickly. It may be useful as a plagiarism or copyright-infringement detector.

ascii

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. There is a Polish version.

cstrings

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.

hexdump

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. (Formerly just known as ‘hex’.)

sccs2rcs

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.

sed

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). Now maintained by René Rebe at Exactcode.

semex

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.

showkey

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!

yacchack

My package for YACC parser encapsulation. Permits multiple YACC parsers in a single program.

Device Drivers

speaker-1.4      (source)

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 and Linux. The speaker driver used in FreeBSD/NetBSD/OpenBSD is a descendant of this code.

Games I've Written

ski

Imagine you are skiing down an infinite slope, facing such hazards as trees, ice, bare ground, and the man-eating Yeti! Unfortunately, you have put your jet-powered skis on backwards, so you can't see ahead where you are going; only behind where you have been. However, you can turn to either side, jump or hop through the air, teleport through hyperspace, launch nuclear ICBMs, and cast spells to call the Fire Demon. And since the hazards occur in patches, you can skillfully outmaneuver them. A fun and very silly game that proves you don't need fancy graphical user interfaces to have a good time. Originally by Mark Stevans in FORTAN; I ported it from C and added color.

galaxis

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.

wumpus

A piece of retrocomputing archeology — my exact clone of the classic Hunt The Wumpus game, exactly as it first appeared in 1974. 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.

xlife-5.0      (source)

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.

Note that this link now points offsite. I haven't had enough time to maintain this code, and have handed it off to Vol Litwr.

bs

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.

bluemoon

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 used to be called just “blue”)

vms-empire

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, and this version works with ncurses. The 1.2 version adds some speedups and corrects errors in the victory-odds table on the man page. 1.3 adds some GN U C cleanup. 1.4 adds an option to set the savefile name. I've renamed the project to "vms-empire" so it won't be confused with the several other empire projects out there, which are mostly elaborate multiplayer network games with X interfaces.

greed

I added color support and some polish to Matt Day's game. He dropped out of sight, so I maintain it. Version 3.3 adds modern packaging.

tetrix

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.

Super Star Trek

The classic ancient FORTRAN game from the days of mainframes and minicomputers, reloaded — retains considerable play value even today.

Miscellanea

morse

morse is a Morse-code training program for aspiring radio hams. It can generate random tests or simulated QSOs resembling those used in the ARRL test (a QSO generator is included). There are a plethora of options to vary the training method. In one of the simpler modes, this program will take text from standard input and render it as Morse-code beeps.

deal

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.

nolan

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 :-).

xve

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.

keybind

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.

letterize

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.

mstrans

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.

pmtools      (source)

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 him.

I have contributed substantial code and documentation to the standard environment of the Python language. The post-1.5.1 versions of the standard rfc822.py, cmd.py, 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 Library; my pildriver image-calculator script is included in it. In July 2000 I was given write access to the Python CVS repository, and am now officially a co-developer of the language.

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.

I've contributed to gnuplot, especially in the PNG driver.

I've contributed substantial code to the PNG library (including the chunk support for iTXt, iCCP, sPLT, sCAL and the high-level interface via png_read_pmng and png_write_png), and am a credited coauthor.

I wrote the @alias and @definfoenclose features of Texinfo.

I designed the Trove classification system used at SourceForge, Freecode, and elsewhere. I'm sort of the architectural grandaddy of SourceForge; the lead architect of that system, Drew Streib, lifted a lot of idea and even his database schemas from the Trove design document.

I wrote the pic2graph and eqn2graph scripts included in groff. I also wrote the PIC manual included in the groff distribution.

I wrote the svncutter tool that's part of Subversion contrib/.

I wrote the rbgen code generator that appears in 1.3 and later versions of Damian Ivereigh's libredblack library, a neat little bit of code for doing B-trees.

I collaborated with Christian Reis on bugzilla-submit.

I'm a senior developer on the Battle For Wesnoth fantasy strategy game.

One way or another, I have a couple meg of code and documentation in the core toolset of every general-purpose Linux and BSD distribution in existence.

Packages I No Longer Maintain

fetchmail

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.

bogofilter

A C implementation of a fast Bayesian spam filter along the lines suggested by LISP wizard Paul Graham. I wrote this, but passed the project lead along in 2003.

Past Collaborations

In 1991 I collaborated with Ray Gardner on a simple hypertext browser for the Jargon File, called vh for "volks-hypertext". Tim Berners-Lee noticed it and sent me email noting that he was working on some hypertext things and suggesting we cooperate, but never replied to my reply. A year or so later he invented the World Wide Web and made vh thoroughly obsolete. I have withdrawn it.

Years ago, I wrote a lot of code for the nethack game; blindfolds were my invention, and my name is still on the nethack manual. However, I'm no longer active with the nethack devteam.