Assorted Open Source Licensed Software

Although some of this software is now very old (last modified in the 1990's or 1980's), many packages continue to see regular use on a wide variety of platforms. They may not compile as is on your system, but it should be easy to update or port anything. Contact us if you have any problems. If there is any interest we'll consider bringing any package up to date, slapping the GPL on it, etc.

[Note: long ago, I was]

bog Form words from a grid of letters
For legal reasons, this game is no longer available here....
lwf A simple text-to-PostScript filter
Developed for the first Apple Laserwriters, one of the very first Unix-based PostScript utilities. Not feature-rich, but it works.
sp Check for a word in one or more dictionaries
Give it a word and the program shows you a list of words that sound similar. Good for when you're not sure how to spell a word correctly.
tdbm A DBM-like database with atomic transactions
xprompt 2.x The latest X utility for scripts that need to prompt the user
In honour of its 30th anniversary, and just for fun, this is a mostly backward compatible update that has been revised for X11R7, adds echo modes to hide input text, and uses GNU configure. It also has a rudimentary copy/paste capability. It has been tested on FreeBSD 12, macOS 10.X, and CentOS 7. Bug reports are welcome.
xprompt 1.4 An X utility for scripts that need to prompt the user
This is "xprompt classic". It is the original version from 1989 that has been adopted by the FreeBSD ports collection and elsewhere.
Threads A non-preemptive threads package
Available upon request, this is an updated version of the Threads sub-kernel that was part of the UBC Distributed Application Programming Environment. It was an integral part of EAN X.500, one of the first implementations of the X.500 directory, and was also the heart of a discrete event simulation package. Thread creation is fast and simple, mainly because a thread does not contain a large amount of context. All threads operate in a single, shared address space, resulting in efficient interprocess communication because pointers can be passed between threads, reducing the need to copy data. Code is shared by all threads. Threads scheduling is non-preemptive - while this means that the package cannot take advantage of multiprocessor cores, multiprocess structuring and concurrency control is simplified and can still result in performance improvements. Calls to the Threads API are efficient since they are simple procedure calls rather than kernel traps, and context switching is inexpensive because the amount of Threads process state is minimal.