I've written some code over the years that I can publish. This is generally just fun little stuff, or experiments. Use at your own risk. No fair making fun of it unless you post the code that you wrote (up to) ten years ago.
    Finds inverses in rings of integers, if they exist.
  • Tree Pattern Matcher Generator
    This is the code implementing the ideas (and providing the benchmarks for) my 1987 POPL paper.
  • Graph / table compress
    This is an experiment testing a somewhat lame heuristic for compressing the indexing tables from the tree pattern-matcher generator with run-length-encoding.
  • Generic C hash table
    This generic hash table has probably seen wider use than any other piece of code that I have written. It differs from the standard presentation of hash tables in that it maps "things" into small integers (starting at one, of course, and increasing upwards) which then makes creation of secondary sets and secondary attributes about as easy as falling off a log.
  • Manipulation of polynomials in Galois field GF(2N)
    This is an experiment in manipulating and generating polynomials in GF(2N). Primes in that fields are useful for making good feedback-shift-registers.
  • Java Math.sin tester
    Uses Hans Boehm's Constructive Reals package to evaluate the quality of Math.sin on a Java platform.
  • A little runner/wrapper/logger
    to help in deciphering the behavior of programs that fire up lots of processes. This way, if a one program invokes another and you want to know how it is doing it (what parameters) you can capture that information.
  • Copy files from tapes
    I bought a QIC tape drive on EBay to help unload personal files from previous jobs. I wrote this program to copy the files (one at a time) from the tape to disk, for further processing with Cygwin tools (e.g., tar). Note, on Windows 2000 this is a "legacy" application, and to read from the tape drive you must first disable Removable Storage Manager (RSM) for the drive. To do this, go to (are you ready?)
    Start ->
    Settings ->
    Control Panel ->
    Administrative Tools ->
    Computer Management ->
    Storage ->
    Removable Storage ->
    Physical Locations ->
    Tape Device ->
    Right Click ->
    Properties ->

    and uncheck "Enable Library" and "Perform Full Inventory on Mount Failure". I would have modified the program to play nice with RSM if anyone had told me how, but they did not, and this worked instead.
  • Generate a web site
    The original motivation for writing this was that my sister-in-law, an art dealer, wanted to put together a web site, and she needed to be able to easily generate and maintain pages for displaying and navigating pictures of art. It also works for pictures of kids, all the attachments in my mailbox, etc. Of course, there's no documentation, at least not yet, and she sensibly chose to hire a professional, who did an excellent job.
  • Join Spread Sheets
    My wife had multiple, related spread sheets that she needed converted into a single large spreadsheet. That is, she needed a database join, but the tools she had weren't interested in giving her that ability. This Java program reads in two spreadsheets in tab-separated format, and two columns to join on, and produces their join, suppressing identical and empty columns, and also producing a difference file containing any extra rows from the second file.
  • Fields to SpreadSheet
    One of my wife's colleagues had some useful data in a Lotus Notes database, and wanted it rendered into an analyzable (Excel, SPSS) format. This program takes the "Structured text" representation of an Louts database and converts it to a tab-separated format, roughly preserving the order of the fields (fields appear in the order in which they were first encountered in the input). It's a little hacky -- any non-space leading text followed by a colon gets interpreted as a field. This turned out to be good enough.