Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
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);
}
Пример #9
0
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);
}
Пример #10
0
HParser* h_end_p__m(HAllocator* mm__) { 
  return h_new_parser(mm__, &end_vt, NULL);
}
Пример #11
0
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);
}
Пример #12
0
HParser* h_whitespace__m(HAllocator* mm__, const HParser* p) {
  return h_new_parser(mm__, &whitespace_vt, (void *)p);
}
Пример #13
0
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);
}
Пример #14
0
HParser* h_and__m(HAllocator* mm__, const HParser* p) {
  // zero-width postive lookahead
  return h_new_parser(mm__, &and_vt, (void *)p);
}