Add support for the #undef macro.

This isn't ideal for two reasons:

1. There's a bunch of stateful redundancy in the lexer that should be
   cleaned up.

2. The hash table does not provide a mechanism to delete an entry, so
   we waste memory to add a new NULL entry in front of the existing
   entry with the same key.

But this does at least work, (it passes the recently added undef test
case).
diff --git a/glcpp-parse.y b/glcpp-parse.y
index 1a7ec49..29614fb 100644
--- a/glcpp-parse.y
+++ b/glcpp-parse.y
@@ -57,7 +57,7 @@
 %parse-param {glcpp_parser_t *parser}
 %lex-param {void *scanner}
 
-%token DEFINE IDENTIFIER NEWLINE TOKEN
+%token DEFINE IDENTIFIER NEWLINE TOKEN UNDEF
 %type <str> token IDENTIFIER TOKEN
 %type <list> replacement_list
 
@@ -73,19 +73,35 @@
 		_print_resolved_token (parser, $1);
 		talloc_free ($1);
 	}
-|	directive
+|	directive_with_newline
 |	content token {
 		_print_resolved_token (parser, $2);
 		talloc_free ($2);
 	}
-|	content directive
+|	content directive_with_newline
+;
+
+directive_with_newline:
+	directive NEWLINE {
+		printf ("\n");
+	}
 ;
 
 directive:
-	DEFINE IDENTIFIER replacement_list NEWLINE {
+	DEFINE IDENTIFIER replacement_list {
 		talloc_steal ($3, $2);
 		hash_table_insert (parser->defines, $3, $2);
-		printf ("\n");
+	}
+|	UNDEF IDENTIFIER {
+		list_t *replacement = hash_table_find (parser->defines, $2);
+		if (replacement) {
+			/* XXX: Need hash table to support a real way
+			 * to remove an element rather than prefixing
+			 * a new node with data of NULL like this. */
+			hash_table_insert (parser->defines, NULL, $2);
+			talloc_free (replacement);
+		}
+		talloc_free ($2);
 	}
 ;