Removing newlines from rules.c
Using typeinfo_compare() during insertion for functions

Rather than typeinfo_list_compare() which is handled in the former
comparison, in addition to the return types of the function.

Fixing bug caused by typeinfo_new() assigning true to the function's
pointer flag because of a pointer existing before the identifier of the
function. There are better fixes, but 120++ does not have function
pointers.
Explicitly casting in get_rule() macro so iter->data can be sent
Adding unknown_type global type comparator
Curly brace cleanups
Refactoring leaf handling into get_typeinfo() for type_check()
Allowing new local variables to override those in inherited scopes

By searching only the top scope while inserting, rather than the entire
stack of scopes.
More formatting for errors
Adding class_type comparator

Setting comparators values in get_typeinfo() so type_check() can
override various fields as needed (i.e. pointer flag).
Adding get_production() helper to return tree node for given rule

Currently used when handling the new operator
Performing type checking in a second tree traversal

Easier to grok logically. Necessitates type_check() perform a pre-order
search of the entire syntax tree, type checking on expressions where
necessary, and noop for non-expressions. Avoids tricky business with
initializers and race to symbol insertion. Also necessitates handling of
nested scopes when encountering function definitions, but avoids
trickiness with implementing type checking concurrently with the
tree_preorder() application of handle_function().

Note that the INITIALIZER production rule must be explicilty ignored
when encountered during recursion of a declarator.

Type checking works for simple assignments of literal values and
symbols, as well as calls to the new operator.
Quieting warning about failed reallocation not being freed
Handling initialization of std::string with a C string
Adding typeinfo_copy() helper
Ignoring array size when comparing for parameters

If array size is 0 this indiciates the array type is for a parameter,
which doesn't specify the array size. In this case, we need to ignore
the mismatched size between the array parameter and the array type
associated with the identifier being sent to the function.
Fixing bug in handle_function() for class members

The search for a class name must happen on the second child of the
function tree, otherwise if the return type is a class it causes the
function to be wrongfully recogized as a class member.
Handling function type checking
Handling type checking of dereference and address unary operators
Fixing bug in handle_param()

Was not ever adding parameters to function symbol tables because of bad
if/else logic. Must add parameter to both parameters list and symbol
table if we can.
Removing C code from passing test data

Thanks to partially working type checking, I have had to dump my C code
tests as they included uses of library functions which I am not
defining (as we're only handling a few common C++ headers, no C
headers).