[net.lang.c] "para" C pretty-printer

mike@hcradm.UUCP (Mike Tilson) (04/30/85)

Geoff Collyer at the University of Toronto recently mentioned the "para"
C formatting program I wrote for V6 UNIX.  This brought back some
memories that you might find amusing.

"Para" was designed to almost completely ignore the user's original
formatting.  The reason for this is interesting:  It was part of a *batch*
computer graphics system that read C programs from *punched cards*!!!
(For you youngsters:  You can see card punches in the new Computer Museum
in Boston, along with the Sage computer and other goodies.)  The program
was then listed on a printer, and the graphics output came out on a
low cost pen plotter.  The whole thing ran on a PDP-11/40 with RK05 disks
running fairly vanilla UNIX V6.  (The kernel was modified to enforce
resource limits and to make sure you couldn't execute any of a number of
system calls, for protection purposes.)  Core dumps produced formatted
listings of variables -- the compiler was modified to produce program
line numbers in the symbol table and *para* produced the variable symbol
table to allow the dump routine to interpret the dump!  (This was a byproduct
of the fact that it also did pretty complete syntax and semantic checking
of the program, including enforcement of more stringent type rules
similar to "lint", which did not exist at the time.  We wanted more
"user-friendly" error handling, and as much as possible all program errors
were handled by this phase.  Also, the machine was too loaded and most student
programs have errors, so we tried to catch everything in "pass 1" and avoid
the expensive "cc" pass.)

The entire thing was a monument to low budgets (CRT's cost too much, and
the system could only run a UNIX shift a few hours per day) and to low cost
student labor.  The only CRT associated with the system was the name:
CRT Batch System.  In this context "CRT" stood for "Crossey-Reeves-Tilson",
the implementors of this creature.

In any case, the punch card format made it mandatory to provide a
prettyprinter -- you couldn't ask the user to re-punch 100 cards in
order to add indenting if you changed a loop.  "Para" had some nice
features -- it understood macros, so that

	#define cycle 	for(;;) {
	#define next	}

	cycle
		foo();
		if(bar())
			break;
		foobar();
	next

indented properly.  (The above is an example -- no remarks on whether you
would write such a program, please.)  It also handled "else if" in a
reasonable way, and it allowed for block comments in the form
	/*
	 * comment, note the stars line up
	 * like this
	 */

There are a lot of things I would do differently today (like not do it
at all) but it was great experience nine years ago, and we spent a fun summer
building the system (including spoolers, multiple batch initiators,
comprehensive job cost accounting, resource controls, operator controls, etc.)
The system saw production use for several years thereafter, much to the
dismay of the students who had to use it.

/Michael Tilson, Human Computing Resources Corp. {utzoo,decvax}!hcr!hcradm!mike