HParser *h_aligned__m(HAllocator *mm__, size_t n) { size_t *pn = h_new(size_t, 1); *pn = n; return h_new_parser(mm__, &aligned_vt, pn); }
HParser* h_action__m(HAllocator* mm__, const HParser* p, const HAction a, void* user_data) { HParseAction *env = h_new(HParseAction, 1); env->p = p; env->action = a; env->user_data = user_data; return h_new_parser(mm__, &action_vt, env); }
HParser* h_with_endianness__m(HAllocator *mm__, char endianness, const HParser *p) { HParseEndianness *env = h_new(HParseEndianness, 1); env->endianness = endianness; env->p = p; return h_new_parser(mm__, &endianness_vt, env); }
static HParser* h_in_or_not__m(HAllocator* mm__, const uint8_t *options, size_t count, int val) { 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); return h_new_parser(mm__, &charset_vt, cs); }
static HParser* h_leftright__m(HAllocator* mm__, const HParser* p, const HParser* q, size_t which) { HIgnoreSeq *seq = h_new(HIgnoreSeq, 1); seq->parsers = h_new(const HParser*, 2); seq->parsers[0] = p; seq->parsers[1] = q; seq->len = 2; seq->which = which; return h_new_parser(mm__, &ignoreseq_vt, seq); }
HParser* h_middle__m(HAllocator* mm__, const HParser* p, const HParser* x, const HParser* q) { HIgnoreSeq *seq = h_new(HIgnoreSeq, 1); seq->parsers = h_new(const HParser*, 3); seq->parsers[0] = p; seq->parsers[1] = x; seq->parsers[2] = q; seq->len = 3; seq->which = 1; return h_new_parser(mm__, &ignoreseq_vt, seq); }
HParser* h_sequence__mv(HAllocator* mm__, HParser *p, va_list ap_) { va_list ap; size_t len = 0; const HParser *arg; va_copy(ap, ap_); do { len++; arg = va_arg(ap, HParser *); } while (arg); va_end(ap); HSequence *s = h_new(HSequence, 1); s->p_array = h_new(HParser *, len); va_copy(ap, ap_); s->p_array[0] = p; for (size_t i = 1; i < len; i++) { s->p_array[i] = va_arg(ap, HParser *); } while (arg); va_end(ap); s->len = len; return h_new_parser(mm__, &sequence_vt, s); }
HParser* h_difference__m(HAllocator* mm__, const HParser* p1, const HParser* p2) { HTwoParsers *env = h_new(HTwoParsers, 1); env->p1 = p1; env->p2 = p2; return h_new_parser(mm__, &difference_vt, env); }
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."); return h_new_parser(mm__, &optional_vt, (void *)p); }
HParser* h_end_p__m(HAllocator* mm__) { return h_new_parser(mm__, &end_vt, NULL); }
HParser* h_get_value__m(HAllocator* mm__, const char* name) { HStoredValue *env = h_new(HStoredValue, 1); env->p = NULL; env->key = name; return h_new_parser(mm__, &get_vt, env); }
HParser* h_whitespace__m(HAllocator* mm__, const HParser* p) { return h_new_parser(mm__, &whitespace_vt, (void *)p); }
HParser* h_ch_range__m(HAllocator* mm__, const uint8_t lower, const uint8_t upper) { HCharset cs = new_charset(mm__); for (int i = 0; i < 256; i++) charset_set(cs, i, (lower <= i) && (i <= upper)); return h_new_parser(mm__, &charset_vt, cs); }
HParser* h_and__m(HAllocator* mm__, const HParser* p) { // zero-width postive lookahead return h_new_parser(mm__, &and_vt, (void *)p); }