allow h_sequence(NULL) as parser for the empty sequence

This commit is contained in:
Sven M. Hallberg 2015-11-01 17:49:53 +01:00
parent e8b1962005
commit 25acd90a48
2 changed files with 26 additions and 19 deletions

View file

@ -117,28 +117,33 @@ HParser* h_sequence__v(HParser* p, va_list ap) {
}
HParser* h_sequence__mv(HAllocator* mm__, HParser *p, va_list ap_) {
va_list ap;
size_t len = 0;
const HParser *arg;
assert(p != NULL);
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);
s->len = 0;
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);
if(p) {
// non-empty sequence
const HParser *arg;
size_t len = 0;
va_list ap;
va_copy(ap, ap_);
do {
len++;
arg = va_arg(ap, HParser *);
} while (arg);
va_end(ap);
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;
}
s->len = len;
return h_new_parser(mm__, &sequence_vt, s);
}