From 8e7a5cc2d37a43de42f2c95269e0355eef139ab6 Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <clonearmy@gmail.com>
Date: Thu, 24 May 2012 12:43:32 +0200
Subject: [PATCH] getting the examples into the build, dns validator needs
 finished

---
 Makefile          |  2 +-
 examples/Makefile | 15 +++++++++++++++
 examples/dns.c    | 45 ++++++++++++++++++++++++---------------------
 3 files changed, 40 insertions(+), 22 deletions(-)
 create mode 100644 examples/Makefile

diff --git a/Makefile b/Makefile
index 27ee4d3..08ce4e1 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 # and kick off a recursive make
 # Also, "make src/all" turns into "make -C src all"
 
-SUBDIRS = src
+SUBDIRS = src examples
 
 .DEFAULT_GOAL := all
 
diff --git a/examples/Makefile b/examples/Makefile
new file mode 100644
index 0000000..7ecd47a
--- /dev/null
+++ b/examples/Makefile
@@ -0,0 +1,15 @@
+
+OUTPUTS := dns.o \
+	   dns
+
+TOPLEVEL := ../
+
+include ../common.mk
+
+
+all: dns
+
+dns: dns.o
+	$(call hush, "Linking $@") $(CC) -o $@ $^ $(LDFLAGS)
+
+dns.o: ../src/hammer.h
diff --git a/examples/dns.c b/examples/dns.c
index 9cf56b9..26f4854 100644
--- a/examples/dns.c
+++ b/examples/dns.c
@@ -1,4 +1,7 @@
-#include "../hammer.h"
+#include "../src/hammer.h"
+
+#define false 0
+#define true 1
 
 bool is_zero(parse_result_t *p) {
   if (TT_UINT != p->ast->token_type)
@@ -10,7 +13,7 @@ bool is_zero(parse_result_t *p) {
  * A label can't be more than 63 characters.
  */
 bool validate_label(parse_result_t *p) {
-  if (TT_SEQ != p->ast->token_type)
+  if (TT_SEQUENCE != p->ast->token_type)
     return 0;
   return (64 > p->ast->seq->used);
 }
@@ -21,23 +24,23 @@ bool validate_label(parse_result_t *p) {
  *
  */
 bool validate_dns(parse_result_t *p) {
-  if (TT_SEQ != p->ast->token_type)
+  if (TT_SEQUENCE != p->ast->token_type)
     return 0;
   // The header holds the counts as its last 4 elements.
   parsed_token_t *header = p->ast->seq->elements[0];
-  size_t qd = header->seq->elements[8];
-  size_t an = header->seq->elements[9];
-  size_t ns = header->seq->elements[10];
-  size_t ar = header->seq->elements[11];
+  size_t qd = ((parsed_token_t*)header->seq->elements[8])->uint;
+  size_t an = ((parsed_token_t*)header->seq->elements[9])->uint;
+  size_t ns = ((parsed_token_t*)header->seq->elements[10])->uint;
+  size_t ar = ((parsed_token_t*)header->seq->elements[11])->uint;
   parsed_token_t *questions = p->ast->seq->elements[1];
   if (questions->seq->used != qd)
-    return false;
+    return 0;
   parsed_token_t *rrs = p->ast->seq->elements[2];
   if (an+ns+ar != rrs->seq->used)
-    return false;
+    return 0;
 }
 
-parser_t init_parser() {
+parser_t* init_parser() {
   static parser_t *dns_message = NULL;
   if (dns_message)
     return dns_message;
@@ -62,12 +65,12 @@ parser_t init_parser() {
 					  uint16(),                       // QCLASS
 					  NULL);
 
-  const parser_t *letter = choice(range('a', 'z'),
-				  range('A', 'Z'),
+  const parser_t *letter = choice(ch_range('a', 'z'),
+				  ch_range('A', 'Z'),
 				  NULL);
 
   const parser_t *let_dig = choice(letter,
-				   range('0', '9'),
+				   ch_range('0', '9'),
 				   NULL);
 
   const parser_t *ldh_str = many1(choice(let_dig,
@@ -95,7 +98,7 @@ parser_t init_parser() {
    * ... but this is easier and equivalent
    */
 
-  parser_t *subdomain = sepBy1(label, ch('.'));
+  const parser_t *subdomain = sepBy1(label, ch('.'));
 
   const parser_t *domain = choice(subdomain, 
 				  ch(' '), 
@@ -105,16 +108,16 @@ parser_t init_parser() {
 				    uint16(),                       // TYPE
 				    uint16(),                       // CLASS
 				    uint32(),                       // TTL
-				    length_value(uint16(), uint8()) // RDLENGTH+RDATA
+				    length_value(uint16(), uint8()), // RDLENGTH+RDATA
 				    NULL);
 
 
-  dns_message = attr_bool(sequence(dns_header,
-				   many(dns_question),
-				   many(dns_rr),
-				   end_p(),
-				   NULL),
-			  validate_dns);
+  dns_message = (parser_t*)attr_bool(sequence(dns_header,
+					      many(dns_question),
+					      many(dns_rr),
+					      end_p(),
+					      NULL),
+				     validate_dns);
 
   return dns_message;
 }
-- 
GitLab