Version 2

Patchlevel 2

- Cproto is now able to generate prototypes for functions defined in lex
  and yacc source files named on the command line.  Lex and yacc source
  files are recognized by the .l or .y extension.
- Fix: The memory allocated to the typedef symbol table was not being
  freed after scanning each source file.
- Fix: Failing to reset a variable during error recovery caused
  segmentation faults.

Patchlevel 1

- Fix: Cproto incorrectly generated the parameter "int ..." in
  prototypes of functions taking variable parameters.
- Fix: Function definitions can now be followed by an optional
  semicolon.  I found this feature in every C compiler I tried.

Patchlevel 0

- Added formal parameter promotion.
- Added prototype style that surrounds prototypes with a guard macro.
- Handles C++ style comment //.
- Nifty new way to set prototype output format.
- Got rid of the shell wrapper used to pipe the input through the C
  preprocessor (cpp).
- For the port to MS-DOS, I modified cproto to run without cpp, but
  since I didn't want to reimplement cpp, the program processes only the
  #include and #define directives and ignores all others.  Macro names
  defined by the #define directive are treated like typedef names if
  they appear in declaration specifiers.

Version 1

Patchlevel 3

- Fix: identical typedef names and struct tags should be allowed.
  For example:

	typedef struct egg_salad egg_salad;

	struct egg_salad {
	    int mayo;
	};

	void dine(egg_salad l)
	{
	}

Patchlevel 2

- Fix: A typedef statement should allow a list of typedefs to be declared.
  Example:

	typedef int a, *b;

- Fix: When run with the -v option on this input, cproto did not output
  a declaration for variable "b":

	char *a="one"; char *b="two";

- The options were renamed.  Added new options that change the output
  format of the prototypes.

Patchlevel 1

- Fix: Incorrect prototypes were produced for functions that take
  function pointer parameters or return a function pointer.  For example,
  cproto produced an erroneous prototype for this function definition:

	void
	(*signal (sig, func))()
	int sig;
	void (*func)();
	{
	    /* stuff */
	}

- The lexical analyser now uses LEX.  It should still be compatible with
  FLEX.
