			       ccmd 2.1
			    [25-Mar-1996]
			  Nelson H. F. Beebe
		   Center for Scientific Computing
		      Department of Mathematics
			  University of Utah
		       Salt Lake City, UT 84112
				 USA
			 Tel: +1 801 581-5254
			 FAX: +1 801 581-4148
		Email: beebe@math.utah.edu (Internet)
		 URL: http://www.math.utah.edu/~beebe

This release (2.1) of ccmd is a major milestone: the code is now
completely converted to ANSI/ISO Standard C, and can also be compiled
under C++.  The previous version, which had been partly converted to
ANSI/ISO Standard C, was used successfully for about two years with mm
0.91. 

Successful builds with C++ compilers have been achieved on these
systems:

	DEC Alpha OSF/1 3.2		cxx
	HP 9000/735 HP-UX 10.0.1	CC
	IBM RS/6000 AIX 3.2		xlC, g++
	IBM RS/6000 AIX 4.1		xlC, g++
	NeXT Mach 3.2			g++
	SGI IRIX 5.3			CC
	Sun SunOS 4.1.3			g++
	Sun Solaris 2.5			CC, g++
	
The g++ version in all cases was 2.7.2.  I gave up trying to make Sun
SunOS 4.1.3 CC work: there are simply too many incompatibilities in
system header files.

The new conversion was carried out mostly automatically, using
protoize.awk, an AWK program written by the author which employs GNU
protoize to construct Standard C code, then merges the differences
with the original code back in under conditional compilation control
so that either K&R C or Standard C can be selected.  Because of
unusual formatting of text in many files, a certain amount of hand
editing was required to complete the job.  Once that was done,
compilation under several C++ compilers turned up further problems
(mostly type inconsistencies) that were all repaired.

The much stronger type checking under C++ compilation gives one
greater confidence that function interface errors have been completely
eliminated, and that library functions are declared via system header
files, rather than directly in the user code, except on a few systems
with deficient header files, thereby enhancing portability.

Where function definitions in source code previous looked like this:

int
foo(a,b,c)
char *a;
fdb *b;
int c;
{
...
}

void
bar()
{
...
}

they now looks like this

#include "config.h"

...

int
#if HAVE_STDC
foo(char *a, fdb *b, int c)
#else
foo(a,b,c)
char *a;
fdb *b;
int c;
#endif
{
...
}

void
bar(VOID)
{
...
}

Although the conditionals in most function definitions clutter the
code, the new support for Standard C and C++ compilation does not
prevent compilation under older K&R-style systems.
