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 brachman@cs.ubc.ca]

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 An X utility for scripts that need to prompt the user
This is included in 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.