From 588d534f3249e2576efe31e0794b91cce6ef3bf5 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" Date: Thu, 17 Jan 2013 00:50:15 +0100 Subject: [PATCH] pull selection and initialization of RDATA parser out of set_rdata --- examples/dns.c | 35 ++++++----------------------------- examples/rr.c | 33 +++++++++++++++++++++++++++++++++ examples/rr.h | 2 ++ 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/examples/dns.c b/examples/dns.c index afeb7b1..4174206 100644 --- a/examples/dns.c +++ b/examples/dns.c @@ -59,39 +59,16 @@ uint8_t** get_txt(const HCountedArray *arr) { return ret; } -void set_rr(struct dns_rr rr, HCountedArray *rdata) { +void set_rdata(struct dns_rr rr, HCountedArray *rdata) { uint8_t *data = h_arena_malloc(rdata->arena, sizeof(uint8_t)*rdata->used); for (size_t i=0; iused; ++i) data[i] = rdata->elements[i]->uint; - // Mapping numeric RR types (as indices) to parsers - const HParser *parsers[] = { - NULL, // there is no type 0 - init_a(), // 1 - init_ns(), - init_md(), - init_mf(), - init_cname(), // 5 - init_soa(), - init_mb(), - init_mg(), - init_mr(), - init_null(), // 10 - init_wks(), - init_ptr(), - init_hinfo(), - init_minfo(), - init_mx(), // 15 - init_txt() - }; - - // Parse rdata if possible. + // Parse RDATA if possible. const HParseResult *p = NULL; - if (rr.type < sizeof(parsers)) { - const HParser *parser = parsers[rr.type]; - if (parser) - p = h_parse(parser, (const uint8_t*)data, rdata->used); - } + const HParser *parser = init_rdata(rr.type); + if (parser) + p = h_parse(parser, (const uint8_t*)data, rdata->used); // If the RR doesn't parse, set its type to 0. if (!p) @@ -214,7 +191,7 @@ const HParsedToken* act_rr(const HParseResult *p) { rr->rdlength = p->ast->seq->elements[4]->seq->used; // Parse and pack RDATA. - set_rr(*rr, p->ast->seq->elements[4]->seq); + set_rdata(*rr, p->ast->seq->elements[4]->seq); return H_MAKE_TOKEN(dns_rr_t, rr); } diff --git a/examples/rr.c b/examples/rr.c index 8dae885..5feaf37 100644 --- a/examples/rr.c +++ b/examples/rr.c @@ -5,6 +5,39 @@ #define false 0 #define true 1 +#define RDATA_TYPE_MAX 16 +const HParser* init_rdata(uint16_t type) { + static const HParser *parsers[RDATA_TYPE_MAX+1]; + static int inited = 0; + + if (type > RDATA_TYPE_MAX) + return NULL; + + if (inited) + return parsers[type]; + + parsers[ 0] = NULL; // there is no type 0 + parsers[ 1] = init_a(); + parsers[ 2] = init_ns(); + parsers[ 3] = init_md(); + parsers[ 4] = init_mf(); + parsers[ 5] = init_cname(); + parsers[ 6] = init_soa(); + parsers[ 7] = init_mb(); + parsers[ 8] = init_mg(); + parsers[ 9] = init_mr(); + parsers[10] = init_null(); + parsers[11] = init_wks(); + parsers[12] = init_ptr(); + parsers[13] = init_hinfo(); + parsers[14] = init_minfo(); + parsers[15] = init_mx(); + parsers[16] = init_txt(); + + inited = 1; + return parsers[type]; +} + const HParser* init_cname() { static const HParser *cname = NULL; if (cname) diff --git a/examples/rr.h b/examples/rr.h index 54172f8..ccac1a6 100644 --- a/examples/rr.h +++ b/examples/rr.h @@ -3,6 +3,8 @@ #include "../src/hammer.h" +const HParser* init_rdata(uint16_t type); + const HParser* init_cname(); const HParser* init_hinfo(); const HParser* init_mb();