From 0083031d6f3fcdf0a1ad84cdeb899c11dd02860b Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Wed, 16 Jan 2013 16:08:30 +0100
Subject: [PATCH] move get_domain logic into an action on the domain parser

---
 examples/dns.c        | 27 +++------------------------
 examples/dns.h        |  5 ++++-
 examples/dns_common.c | 29 ++++++++++++++++++++++++++++-
 3 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/examples/dns.c b/examples/dns.c
index fb2b1487..59046163 100644
--- a/examples/dns.c
+++ b/examples/dns.c
@@ -43,30 +43,9 @@ bool validate_dns(HParseResult *p) {
 }
 
 char* get_domain(const HParsedToken *t) {
-  switch(t->token_type) {
-  case TT_UINT:
-    return " ";
-  case TT_SEQUENCE:
-    {
-      // Sequence of subdomains separated by "."
-      // Each subdomain is a label, which can be no more than 63 chars.
-      char *ret = h_arena_malloc(t->seq->arena, 64*t->seq->used);
-      size_t count = 0;
-      for (size_t i=0; i<t->seq->used; ++i) {
-	HParsedToken *tmp = t->seq->elements[i];
-	for (size_t j=0; j<tmp->seq->used; ++j) {
-	  ret[count] = tmp->seq->elements[i]->uint;
-	  ++count;
-	}
-	ret[count] = '.';
-	++count;
-      }
-      ret[count-1] = '\x00';
-      return ret;
-    }
-  default:
-    return NULL;
-  }
+  assert(t != NULL);
+  assert(t->token_type == (HTokenType)TT_dns_domain);
+  return t->user;
 }
 
 uint8_t* get_cs(const HCountedArray *arr) {
diff --git a/examples/dns.h b/examples/dns.h
index 672e3b7c..913b1869 100644
--- a/examples/dns.h
+++ b/examples/dns.h
@@ -6,7 +6,8 @@ enum DNSTokenType_ {
   TT_dns_label,
   TT_dns_qname,
   TT_dns_question,
-  TT_dns_rr
+  TT_dns_rr,
+  TT_dns_domain
 };
 
 typedef struct dns_header {
@@ -98,6 +99,8 @@ typedef struct dns_rr {
   };
 } dns_rr_t;
 
+typedef char *dns_domain_t;
+
 typedef struct dns_message {
   dns_header_t header;
   dns_question_t *questions;
diff --git a/examples/dns_common.c b/examples/dns_common.c
index 0b07cf8d..d25abe2b 100644
--- a/examples/dns_common.c
+++ b/examples/dns_common.c
@@ -1,5 +1,6 @@
 #include "../src/hammer.h"
 #include "dns_common.h"
+#include "dns.h"
 
 #define false 0
 #define true 1
@@ -13,6 +14,32 @@ bool validate_label(HParseResult *p) {
   return (64 > p->ast->seq->used);
 }
 
+const HParsedToken* act_domain(const HParseResult *p) {
+  switch(p->ast->token_type) {
+  case TT_UINT:
+    return H_MAKE_TOKEN(dns_domain, " ");
+  case TT_SEQUENCE:
+    {
+      // Sequence of subdomains separated by "."
+      // Each subdomain is a label, which can be no more than 63 chars.
+      char *ret = h_arena_malloc(p->arena, 64*p->ast->seq->used);
+      size_t count = 0;
+      for (size_t i=0; i<p->ast->seq->used; ++i) {
+	HParsedToken *tmp = p->ast->seq->elements[i];
+	for (size_t j=0; j<tmp->seq->used; ++j) {
+	  ret[count] = tmp->seq->elements[i]->uint;
+	  ++count;
+	}
+	ret[count] = '.';
+	++count;
+      }
+      ret[count-1] = '\x00';
+      return H_MAKE_TOKEN(dns_domain, ret);
+    }
+  default:
+    return NULL;
+  }
+}
 
 const HParser* init_domain() {
   static const HParser *ret = NULL;
@@ -29,7 +56,7 @@ const HParser* init_domain() {
 					    NULL),
 			         validate_label));
   H_RULE (subdomain, h_sepBy1(label, h_ch('.')));
-  H_RULE (domain,    h_choice(subdomain, h_ch(' '), NULL));
+  H_ARULE(domain,    h_choice(subdomain, h_ch(' '), NULL));
 
   ret = domain;
   return ret;
-- 
GitLab