From 88091b602fe2b771ee1cbb4f1b8898388b5162ab Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Sat, 27 Apr 2013 04:17:47 +0200 Subject: [PATCH] wrap all allocs of HParser in helper h_new_parser --- src/internal.h | 9 +++++++++ src/parsers/action.c | 5 +---- src/parsers/and.c | 5 +---- src/parsers/attr_bool.c | 5 +---- src/parsers/bits.c | 5 +---- src/parsers/butnot.c | 7 +++---- src/parsers/ch.c | 5 +---- src/parsers/charset.c | 10 ++-------- src/parsers/choice.c | 4 +--- src/parsers/difference.c | 7 +++---- src/parsers/end.c | 5 +---- src/parsers/ignore.c | 5 +---- src/parsers/ignoreseq.c | 10 ++-------- src/parsers/indirect.c | 5 +---- src/parsers/int_range.c | 5 +---- src/parsers/many.c | 30 ++++++------------------------ src/parsers/not.c | 5 +---- src/parsers/nothing.c | 4 +--- src/parsers/optional.c | 5 +---- src/parsers/sequence.c | 4 +--- src/parsers/token.c | 5 +---- src/parsers/whitespace.c | 5 +---- src/parsers/xor.c | 7 +++---- 23 files changed, 44 insertions(+), 113 deletions(-) diff --git a/src/internal.h b/src/internal.h index 6a7aba9b..edb0c217 100644 --- a/src/internal.h +++ b/src/internal.h @@ -225,6 +225,15 @@ long long h_read_bits(HInputStream* state, int count, char signed_p); HParseResult* h_do_parse(const HParser* parser, HParseState *state); void put_cached(HParseState *ps, const HParser *p, HParseResult *cached); +static inline +HParser *h_new_parser(HAllocator *mm__, const HParserVtable *vt, void *env) { + HParser *p = h_new(HParser, 1); + memset(p, 0, sizeof(HParser)); + p->vtable = vt; + p->env = env; + return p; +} + HCFChoice *h_desugar(HAllocator *mm__, const HParser *parser); HCountedArray *h_carray_new_sized(HArena * arena, size_t size); diff --git a/src/parsers/action.c b/src/parsers/action.c index ea409d76..d6bcc0c9 100644 --- a/src/parsers/action.c +++ b/src/parsers/action.c @@ -56,11 +56,8 @@ const HParser* h_action(const HParser* p, const HAction a) { } const HParser* h_action__m(HAllocator* mm__, const HParser* p, const HAction a) { - HParser *res = h_new(HParser, 1); - res->vtable = &action_vt; HParseAction *env = h_new(HParseAction, 1); env->p = p; env->action = a; - res->env = (void*)env; - return res; + return h_new_parser(mm__, &action_vt, env); } diff --git a/src/parsers/and.c b/src/parsers/and.c index 650a11a1..f5fadb71 100644 --- a/src/parsers/and.c +++ b/src/parsers/and.c @@ -30,8 +30,5 @@ const HParser* h_and(const HParser* p) { } const HParser* h_and__m(HAllocator* mm__, const HParser* p) { // zero-width postive lookahead - HParser *res = h_new(HParser, 1); - res->env = (void*)p; - res->vtable = &and_vt; - return res; + return h_new_parser(mm__, &and_vt, (void *)p); } diff --git a/src/parsers/attr_bool.c b/src/parsers/attr_bool.c index 78bd30be..c365f00d 100644 --- a/src/parsers/attr_bool.c +++ b/src/parsers/attr_bool.c @@ -59,11 +59,8 @@ const HParser* h_attr_bool(const HParser* p, HPredicate pred) { return h_attr_bool__m(&system_allocator, p, pred); } const HParser* h_attr_bool__m(HAllocator* mm__, const HParser* p, HPredicate pred) { - HParser *res = h_new(HParser, 1); - res->vtable = &attr_bool_vt; HAttrBool *env = h_new(HAttrBool, 1); env->p = p; env->pred = pred; - res->env = (void*)env; - return res; + return h_new_parser(mm__, &attr_bool_vt, env); } diff --git a/src/parsers/bits.c b/src/parsers/bits.c index ee3dde9a..54602eaf 100644 --- a/src/parsers/bits.c +++ b/src/parsers/bits.c @@ -54,10 +54,7 @@ const HParser* h_bits__m(HAllocator* mm__, size_t len, bool sign) { struct bits_env *env = h_new(struct bits_env, 1); env->length = len; env->signedp = sign; - HParser *res = h_new(HParser, 1); - res->vtable = &bits_vt; - res->env = env; - return res; + return h_new_parser(mm__, &bits_vt, env); } #define SIZED_BITS(name_pre, len, signedp) \ diff --git a/src/parsers/butnot.c b/src/parsers/butnot.c index c0e3b41e..3dec3227 100644 --- a/src/parsers/butnot.c +++ b/src/parsers/butnot.c @@ -52,9 +52,8 @@ const HParser* h_butnot(const HParser* p1, const HParser* p2) { } const HParser* h_butnot__m(HAllocator* mm__, const HParser* p1, const HParser* p2) { HTwoParsers *env = h_new(HTwoParsers, 1); - env->p1 = p1; env->p2 = p2; - HParser *ret = h_new(HParser, 1); - ret->vtable = &butnot_vt; ret->env = (void*)env; - return ret; + env->p1 = p1; + env->p2 = p2; + return h_new_parser(mm__, &butnot_vt, env); } diff --git a/src/parsers/ch.c b/src/parsers/ch.c index f0e91c19..82b5e9ac 100644 --- a/src/parsers/ch.c +++ b/src/parsers/ch.c @@ -31,8 +31,5 @@ const HParser* h_ch(const uint8_t c) { return h_ch__m(&system_allocator, c); } const HParser* h_ch__m(HAllocator* mm__, const uint8_t c) { - HParser *ret = h_new(HParser, 1); - ret->vtable = &ch_vt; - ret->env = (void*)(unsigned long)(c); - return (const HParser*)ret; + return h_new_parser(mm__, &ch_vt, (void *)(uintptr_t)c); } diff --git a/src/parsers/charset.c b/src/parsers/charset.c index 5a76239f..858d299c 100644 --- a/src/parsers/charset.c +++ b/src/parsers/charset.c @@ -33,27 +33,21 @@ const HParser* h_ch_range(const uint8_t lower, const uint8_t upper) { return h_ch_range__m(&system_allocator, lower, upper); } const HParser* h_ch_range__m(HAllocator* mm__, const uint8_t lower, const uint8_t upper) { - HParser *ret = h_new(HParser, 1); HCharset cs = new_charset(mm__); for (int i = 0; i < 256; i++) charset_set(cs, i, (lower <= i) && (i <= upper)); - ret->vtable = &charset_vt; - ret->env = (void*)cs; - return (const HParser*)ret; + return h_new_parser(mm__, &charset_vt, cs); } static const HParser* h_in_or_not__m(HAllocator* mm__, const uint8_t *options, size_t count, int val) { - HParser *ret = h_new(HParser, 1); HCharset cs = new_charset(mm__); for (size_t i = 0; i < 256; i++) charset_set(cs, i, 1-val); for (size_t i = 0; i < count; i++) charset_set(cs, options[i], val); - ret->vtable = &charset_vt; - ret->env = (void*)cs; - return (const HParser*)ret; + return h_new_parser(mm__, &charset_vt, cs); } const HParser* h_in(const uint8_t *options, size_t count) { diff --git a/src/parsers/choice.c b/src/parsers/choice.c index 88e908bd..28394058 100644 --- a/src/parsers/choice.c +++ b/src/parsers/choice.c @@ -103,8 +103,6 @@ const HParser* h_choice__mv(HAllocator* mm__, const HParser* p, va_list ap_) { va_end(ap); s->len = len; - HParser *ret = h_new(HParser, 1); - ret->vtable = &choice_vt; ret->env = (void*)s; - return ret; + return h_new_parser(mm__, &choice_vt, s); } diff --git a/src/parsers/difference.c b/src/parsers/difference.c index 35287590..93024907 100644 --- a/src/parsers/difference.c +++ b/src/parsers/difference.c @@ -51,8 +51,7 @@ const HParser* h_difference(const HParser* p1, const HParser* p2) { } const HParser* h_difference__m(HAllocator* mm__, const HParser* p1, const HParser* p2) { HTwoParsers *env = h_new(HTwoParsers, 1); - env->p1 = p1; env->p2 = p2; - HParser *ret = h_new(HParser, 1); - ret->vtable = &difference_vt; ret->env = (void*)env; - return ret; + env->p1 = p1; + env->p2 = p2; + return h_new_parser(mm__, &difference_vt, env); } diff --git a/src/parsers/end.c b/src/parsers/end.c index 2a458e52..05aeaafb 100644 --- a/src/parsers/end.c +++ b/src/parsers/end.c @@ -29,8 +29,5 @@ const HParser* h_end_p() { } const HParser* h_end_p__m(HAllocator* mm__) { - HParser *ret = h_new(HParser, 1); - ret->vtable = &end_vt; - ret->env = NULL; - return (const HParser*)ret; + return h_new_parser(mm__, &end_vt, NULL); } diff --git a/src/parsers/ignore.c b/src/parsers/ignore.c index 6ae2803d..33bccd01 100644 --- a/src/parsers/ignore.c +++ b/src/parsers/ignore.c @@ -36,8 +36,5 @@ const HParser* h_ignore(const HParser* p) { return h_ignore__m(&system_allocator, p); } const HParser* h_ignore__m(HAllocator* mm__, const HParser* p) { - HParser* ret = h_new(HParser, 1); - ret->vtable = &ignore_vt; - ret->env = (void*)p; - return ret; + return h_new_parser(mm__, &ignore_vt, (void *)p); } diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c index 2adffc6c..822920b1 100644 --- a/src/parsers/ignoreseq.c +++ b/src/parsers/ignoreseq.c @@ -81,10 +81,7 @@ static const HParser* h_leftright__m(HAllocator* mm__, const HParser* p, const H seq->len = 2; seq->which = which; - HParser *ret = h_new(HParser, 1); - ret->vtable = &ignoreseq_vt; - ret->env = (void*)seq; - return ret; + return h_new_parser(mm__, &ignoreseq_vt, seq); } const HParser* h_left(const HParser* p, const HParser* q) { @@ -114,8 +111,5 @@ const HParser* h_middle__m(HAllocator* mm__, const HParser* p, const HParser* x, seq->len = 3; seq->which = 1; - HParser *ret = h_new(HParser, 1); - ret->vtable = &ignoreseq_vt; - ret->env = (void*)seq; - return ret; + return h_new_parser(mm__, &ignoreseq_vt, seq); } diff --git a/src/parsers/indirect.c b/src/parsers/indirect.c index c6935489..77227d2c 100644 --- a/src/parsers/indirect.c +++ b/src/parsers/indirect.c @@ -32,8 +32,5 @@ HParser* h_indirect() { return h_indirect__m(&system_allocator); } HParser* h_indirect__m(HAllocator* mm__) { - HParser *res = h_new(HParser, 1); - res->vtable = &indirect_vt; - res->env = NULL; - return res; + return h_new_parser(mm__, &indirect_vt, NULL); } diff --git a/src/parsers/int_range.c b/src/parsers/int_range.c index 64450da3..50149b2e 100644 --- a/src/parsers/int_range.c +++ b/src/parsers/int_range.c @@ -143,8 +143,5 @@ const HParser* h_int_range__m(HAllocator* mm__, const HParser *p, const int64_t r_env->p = p; r_env->lower = lower; r_env->upper = upper; - HParser *ret = h_new(HParser, 1); - ret->vtable = &int_range_vt; - ret->env = (void*)r_env; - return ret; + return h_new_parser(mm__, &int_range_vt, r_env); } diff --git a/src/parsers/many.c b/src/parsers/many.c index f4829ebc..2ce89f13 100644 --- a/src/parsers/many.c +++ b/src/parsers/many.c @@ -123,75 +123,60 @@ const HParser* h_many(const HParser* p) { return h_many__m(&system_allocator, p); } const HParser* h_many__m(HAllocator* mm__, const HParser* p) { - HParser *res = h_new(HParser, 1); HRepeat *env = h_new(HRepeat, 1); env->p = p; env->sep = h_epsilon_p__m(mm__); env->count = 0; env->min_p = true; - res->vtable = &many_vt; - res->env = env; - return res; + return h_new_parser(mm__, &many_vt, env); } const HParser* h_many1(const HParser* p) { return h_many1__m(&system_allocator, p); } const HParser* h_many1__m(HAllocator* mm__, const HParser* p) { - HParser *res = h_new(HParser, 1); HRepeat *env = h_new(HRepeat, 1); env->p = p; env->sep = h_epsilon_p__m(mm__); env->count = 1; env->min_p = true; - res->vtable = &many_vt; - res->env = env; - return res; + return h_new_parser(mm__, &many_vt, env); } const HParser* h_repeat_n(const HParser* p, const size_t n) { return h_repeat_n__m(&system_allocator, p, n); } const HParser* h_repeat_n__m(HAllocator* mm__, const HParser* p, const size_t n) { - HParser *res = h_new(HParser, 1); HRepeat *env = h_new(HRepeat, 1); env->p = p; env->sep = h_epsilon_p__m(mm__); env->count = n; env->min_p = false; - res->vtable = &many_vt; - res->env = env; - return res; + return h_new_parser(mm__, &many_vt, env); } const HParser* h_sepBy(const HParser* p, const HParser* sep) { return h_sepBy__m(&system_allocator, p, sep); } const HParser* h_sepBy__m(HAllocator* mm__, const HParser* p, const HParser* sep) { - HParser *res = h_new(HParser, 1); HRepeat *env = h_new(HRepeat, 1); env->p = p; env->sep = sep; env->count = 0; env->min_p = true; - res->vtable = &many_vt; - res->env = env; - return res; + return h_new_parser(mm__, &many_vt, env); } const HParser* h_sepBy1(const HParser* p, const HParser* sep) { return h_sepBy1__m(&system_allocator, p, sep); } const HParser* h_sepBy1__m(HAllocator* mm__, const HParser* p, const HParser* sep) { - HParser *res = h_new(HParser, 1); HRepeat *env = h_new(HRepeat, 1); env->p = p; env->sep = sep; env->count = 1; env->min_p = true; - res->vtable = &many_vt; - res->env = env; - return res; + return h_new_parser(mm__, &many_vt, env); } typedef struct { @@ -232,11 +217,8 @@ const HParser* h_length_value(const HParser* length, const HParser* value) { return h_length_value__m(&system_allocator, length, value); } const HParser* h_length_value__m(HAllocator* mm__, const HParser* length, const HParser* value) { - HParser *res = h_new(HParser, 1); - res->vtable = &length_value_vt; HLenVal *env = h_new(HLenVal, 1); env->length = length; env->value = value; - res->env = (void*)env; - return res; + return h_new_parser(mm__, &length_value_vt, env); } diff --git a/src/parsers/not.c b/src/parsers/not.c index b0d5a8e1..523b92a6 100644 --- a/src/parsers/not.c +++ b/src/parsers/not.c @@ -26,8 +26,5 @@ const HParser* h_not(const HParser* p) { return h_not__m(&system_allocator, p); } const HParser* h_not__m(HAllocator* mm__, const HParser* p) { - HParser *res = h_new(HParser, 1); - res->vtable = ¬_vt; - res->env = (void*)p; - return res; + return h_new_parser(mm__, ¬_vt, (void *)p); } diff --git a/src/parsers/nothing.c b/src/parsers/nothing.c index ebf0daf4..b204acae 100644 --- a/src/parsers/nothing.c +++ b/src/parsers/nothing.c @@ -26,7 +26,5 @@ const HParser* h_nothing_p() { return h_nothing_p__m(&system_allocator); } const HParser* h_nothing_p__m(HAllocator* mm__) { - HParser *ret = h_new(HParser, 1); - ret->vtable = ¬hing_vt; ret->env = NULL; - return (const HParser*)ret; + return h_new_parser(mm__, ¬hing_vt, NULL); } diff --git a/src/parsers/optional.c b/src/parsers/optional.c index b8777d3c..27199ab2 100644 --- a/src/parsers/optional.c +++ b/src/parsers/optional.c @@ -39,9 +39,6 @@ const HParser* h_optional(const HParser* p) { const HParser* h_optional__m(HAllocator* mm__, const HParser* p) { // TODO: re-add this //assert_message(p->vtable != &ignore_vt, "Thou shalt ignore an option, rather than the other way 'round."); - HParser *ret = h_new(HParser, 1); - ret->vtable = &optional_vt; - ret->env = (void*)p; - return ret; + return h_new_parser(mm__, &optional_vt, (void *)p); } diff --git a/src/parsers/sequence.c b/src/parsers/sequence.c index dde2a319..e5d1da98 100644 --- a/src/parsers/sequence.c +++ b/src/parsers/sequence.c @@ -107,7 +107,5 @@ const HParser* h_sequence__mv(HAllocator* mm__, const HParser *p, va_list ap_) { va_end(ap); s->len = len; - HParser *ret = h_new(HParser, 1); - ret->vtable = &sequence_vt; ret->env = (void*)s; - return ret; + return h_new_parser(mm__, &sequence_vt, s); } diff --git a/src/parsers/token.c b/src/parsers/token.c index 40779b99..610a276a 100644 --- a/src/parsers/token.c +++ b/src/parsers/token.c @@ -50,8 +50,5 @@ const HParser* h_token(const uint8_t *str, const size_t len) { const HParser* h_token__m(HAllocator* mm__, const uint8_t *str, const size_t len) { HToken *t = h_new(HToken, 1); t->str = (uint8_t*)str, t->len = len; - HParser *ret = h_new(HParser, 1); - ret->vtable = &token_vt; - ret->env = t; - return (const HParser*)ret; + return h_new_parser(mm__, &token_vt, t); } diff --git a/src/parsers/whitespace.c b/src/parsers/whitespace.c index 92e5bd0d..29e4ec70 100644 --- a/src/parsers/whitespace.c +++ b/src/parsers/whitespace.c @@ -60,8 +60,5 @@ const HParser* h_whitespace(const HParser* p) { return h_whitespace__m(&system_allocator, p); } const HParser* h_whitespace__m(HAllocator* mm__, const HParser* p) { - HParser *ret = h_new(HParser, 1); - ret->vtable = &whitespace_vt; - ret->env = (void*)p; - return ret; + return h_new_parser(mm__, &whitespace_vt, (void *)p); } diff --git a/src/parsers/xor.c b/src/parsers/xor.c index c8dbe3d1..006fd9cb 100644 --- a/src/parsers/xor.c +++ b/src/parsers/xor.c @@ -48,8 +48,7 @@ const HParser* h_xor(const HParser* p1, const HParser* p2) { } const HParser* h_xor__m(HAllocator* mm__, const HParser* p1, const HParser* p2) { HTwoParsers *env = h_new(HTwoParsers, 1); - env->p1 = p1; env->p2 = p2; - HParser *ret = h_new(HParser, 1); - ret->vtable = &xor_vt; ret->env = (void*)env; - return ret; + env->p1 = p1; + env->p2 = p2; + return h_new_parser(mm__, &xor_vt, env); } -- GitLab