const HParsedToken* act_cstr(const HParseResult *p) { dns_cstr_t *cs = H_ALLOC(dns_cstr_t); const HCountedArray *arr = H_CAST_SEQ(p->ast); uint8_t *ret = h_arena_malloc(arr->arena, sizeof(uint8_t)*arr->used); for (size_t i=0; i<arr->used; ++i) ret[i] = H_CAST_UINT(arr->elements[i]); assert(ret[arr->used-1] == '\0'); // XXX Is this right?! If so, shouldn't it be a validation? *cs = ret; return H_MAKE(dns_cstr_t, cs); }
static HParsedToken *act_bytes(const HParseResult *p, void *user) { DNP3_Object *o = H_ALLOC(DNP3_Object); HCountedArray *a = H_CAST_SEQ(p->ast); size_t n = a->used; o->applid.len = n; o->applid.str = h_arena_malloc(p->arena, n+1); // null-terminate for(size_t i=0; i<n; i++) o->applid.str[i] = H_CAST_UINT(a->elements[i]); o->applid.str[n] = '\0'; return H_MAKE(DNP3_Object, o); }
const HParsedToken *act_txt(const HParseResult *p) { dns_rr_txt_t *txt = H_ALLOC(dns_rr_txt_t); const HCountedArray *arr = H_CAST_SEQ(p->ast); uint8_t **ret = h_arena_malloc(arr->arena, sizeof(uint8_t*)*arr->used); for (size_t i=0; i<arr->used; ++i) { size_t len = h_seq_len(arr->elements[i]); uint8_t *tmp = h_arena_malloc(arr->arena, sizeof(uint8_t)*len); for (size_t j=0; j<len; ++j) tmp[j] = H_INDEX_UINT(arr->elements[i], j); ret[i] = tmp; } txt->count = arr->used; txt->txt_data = ret; return H_MAKE(dns_rr_txt_t, txt); }