replace casting h_seq_index functions with H_INDEX macro family,
supporting varargs
This commit is contained in:
parent
811c68fdf2
commit
18fbf6fd69
3 changed files with 25 additions and 51 deletions
|
|
@ -135,50 +135,26 @@ HParsedToken *h_seq_index(const HParsedToken *p, size_t i)
|
||||||
return h_carray_index(p->seq, i);
|
return h_carray_index(p->seq, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
HParsedToken *h_seq_index_path(HParsedToken *p, ...)
|
HParsedToken *h_seq_index_path(const HParsedToken *p, size_t i, ...)
|
||||||
{
|
{
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
va_start(va, p);
|
va_start(va, i);
|
||||||
p = h_seq_index_vpath(p, va);
|
HParsedToken *ret = h_seq_index_vpath(p, i, va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
return p;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
HParsedToken *h_seq_index_vpath(HParsedToken *p, va_list va)
|
HParsedToken *h_seq_index_vpath(const HParsedToken *p, size_t i, va_list va)
|
||||||
{
|
{
|
||||||
int i;
|
HParsedToken *ret = h_seq_index(p, i);
|
||||||
|
int j;
|
||||||
|
|
||||||
while((i = va_arg(va, int)) >= 0)
|
while((j = va_arg(va, int)) >= 0)
|
||||||
p = h_seq_index(p, i);
|
ret = h_seq_index(p, j);
|
||||||
|
|
||||||
return p;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
HCountedArray *h_seq_index_seq(const HParsedToken *p, size_t i)
|
|
||||||
{
|
|
||||||
return h_cast_seq(h_seq_index(p, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
HBytes h_seq_index_bytes(const HParsedToken *p, size_t i)
|
|
||||||
{
|
|
||||||
return h_cast_bytes(h_seq_index(p, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t h_seq_index_sint(const HParsedToken *p, size_t i)
|
|
||||||
{
|
|
||||||
return h_cast_sint(h_seq_index(p, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t h_seq_index_uint(const HParsedToken *p, size_t i)
|
|
||||||
{
|
|
||||||
return h_cast_uint(h_seq_index(p, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
void *h_seq_index_user(HTokenType type, const HParsedToken *p, size_t i)
|
|
||||||
{
|
|
||||||
return h_cast(type, h_seq_index(p, i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void h_seq_snoc(HParsedToken *xs, const HParsedToken *x)
|
void h_seq_snoc(HParsedToken *xs, const HParsedToken *x)
|
||||||
|
|
|
||||||
|
|
@ -84,26 +84,24 @@ HParsedToken **h_seq_elements(const HParsedToken *p);
|
||||||
HParsedToken *h_seq_index(const HParsedToken *p, size_t i);
|
HParsedToken *h_seq_index(const HParsedToken *p, size_t i);
|
||||||
|
|
||||||
// Access an element in a nested sequence by a path of indices.
|
// Access an element in a nested sequence by a path of indices.
|
||||||
HParsedToken *h_seq_index_path(HParsedToken *p, ...);
|
HParsedToken *h_seq_index_path(const HParsedToken *p, size_t i, ...);
|
||||||
HParsedToken *h_seq_index_vpath(HParsedToken *p, va_list va);
|
HParsedToken *h_seq_index_vpath(const HParsedToken *p, size_t i, va_list va);
|
||||||
|
|
||||||
// Convenience functions combining index access and h_cast_*.
|
// Convenience macros combining (nested) index access and h_cast.
|
||||||
HCountedArray *h_seq_index_seq (const HParsedToken *p, size_t i);
|
|
||||||
HBytes h_seq_index_bytes(const HParsedToken *p, size_t i);
|
|
||||||
int64_t h_seq_index_sint (const HParsedToken *p, size_t i);
|
|
||||||
uint64_t h_seq_index_uint (const HParsedToken *p, size_t i);
|
|
||||||
void * h_seq_index_user (HTokenType type, const HParsedToken *p, size_t i);
|
|
||||||
|
|
||||||
// Standard short-hand to access and cast a user-type sequence element.
|
|
||||||
#define H_INDEX(TYP, SEQ, ...) \
|
#define H_INDEX(TYP, SEQ, ...) \
|
||||||
((TYP *) h_cast(TT_ ## TYP, h_seq_index_path(SEQ, __VA_ARGS__, -1)))
|
((TYP *) h_cast(TT_ ## TYP, H_INDEX_TOKEN(SEQ, __VA_ARGS__)))
|
||||||
|
#define H_INDEX_SEQ(SEQ, ...) h_cast_seq(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
|
||||||
|
#define H_INDEX_BYTES(SEQ, ...) h_cast_bytes(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
|
||||||
|
#define H_INDEX_SINT(SEQ, ...) h_cast_sint(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
|
||||||
|
#define H_INDEX_UINT(SEQ, ...) h_cast_uint(H_INDEX_TOKEN(SEQ, __VA_ARGS__))
|
||||||
|
#define H_INDEX_TOKEN(SEQ, ...) h_seq_index_path(SEQ, __VA_ARGS__, -1)
|
||||||
|
|
||||||
// Standard short-hand to access and cast elements on a sequence token.
|
// Standard short-hand to access and cast elements on a sequence token.
|
||||||
#define H_FIELD(TYP, ...) H_INDEX(TYP, p->ast, __VA_ARGS__)
|
#define H_FIELD(TYP, ...) H_INDEX(TYP, p->ast, __VA_ARGS__)
|
||||||
#define H_FIELD_SEQ(IDX) h_seq_index_seq(p->ast, IDX)
|
#define H_FIELD_SEQ(...) H_INDEX_SEQ(p->ast, __VA_ARGS__)
|
||||||
#define H_FIELD_BYTES(IDX) h_seq_index_bytes(p->ast, IDX)
|
#define H_FIELD_BYTES(...) H_INDEX_BYTES(p->ast, __VA_ARGS__)
|
||||||
#define H_FIELD_SINT(IDX) h_seq_index_sint(p->ast, IDX)
|
#define H_FIELD_SINT(...) H_INDEX_SINT(p->ast, __VA_ARGS__)
|
||||||
#define H_FIELD_UINT(IDX) h_seq_index_uint(p->ast, IDX)
|
#define H_FIELD_UINT(...) H_INDEX_UINT(p->ast, __VA_ARGS__)
|
||||||
|
|
||||||
// Lower-level helper for h_seq_index.
|
// Lower-level helper for h_seq_index.
|
||||||
HParsedToken *h_carray_index(const HCountedArray *a, size_t i); // XXX -> internal
|
HParsedToken *h_carray_index(const HCountedArray *a, size_t i); // XXX -> internal
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ const HParsedToken *act_txt(const HParseResult *p) {
|
||||||
size_t len = h_seq_len(arr->elements[i]);
|
size_t len = h_seq_len(arr->elements[i]);
|
||||||
uint8_t *tmp = h_arena_malloc(arr->arena, sizeof(uint8_t)*len);
|
uint8_t *tmp = h_arena_malloc(arr->arena, sizeof(uint8_t)*len);
|
||||||
for (size_t j=0; j<len; ++j)
|
for (size_t j=0; j<len; ++j)
|
||||||
tmp[j] = h_seq_index_uint(arr->elements[i], j);
|
tmp[j] = H_INDEX_UINT(arr->elements[i], j);
|
||||||
ret[i] = tmp;
|
ret[i] = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,7 +82,7 @@ const HParsedToken* act_wks(const HParseResult *p) {
|
||||||
wks->len = H_FIELD_SEQ(2)->used;
|
wks->len = H_FIELD_SEQ(2)->used;
|
||||||
wks->bit_map = h_arena_malloc(p->arena, sizeof(uint8_t)*wks->len);
|
wks->bit_map = h_arena_malloc(p->arena, sizeof(uint8_t)*wks->len);
|
||||||
for (size_t i=0; i<wks->len; ++i)
|
for (size_t i=0; i<wks->len; ++i)
|
||||||
wks->bit_map[i] = h_seq_index_uint(h_seq_index(p->ast, 2), i);
|
wks->bit_map[i] = H_INDEX_UINT(p->ast, 2, i);
|
||||||
|
|
||||||
return H_MAKE(dns_rr_wks_t, wks);
|
return H_MAKE(dns_rr_wks_t, wks);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue