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); }
static HParsedToken *act_segment(const HParseResult *p, void *user) { DNP3_Segment *s = H_ALLOC(DNP3_Segment); s->fin = H_FIELD_UINT(0, 0); s->fir = H_FIELD_UINT(0, 1); s->seq = H_FIELD_UINT(0, 2); HCountedArray *a = H_FIELD_SEQ(1); s->len = a->used; s->payload = h_arena_malloc(p->arena, s->len); assert(s->payload != NULL); for(size_t i=0; i<s->len; i++) { s->payload[i] = H_CAST_UINT(a->elements[i]); } return H_MAKE(DNP3_Segment, s); }
const HParsedToken *act_bsfdig(const HParseResult *p) { HParsedToken *res = H_MAKE_UINT(0); uint8_t c = H_CAST_UINT(p->ast); if(c >= 0x40 && c <= 0x5A) // A-Z res->uint = c - 0x41; else if(c >= 0x60 && c <= 0x7A) // a-z res->uint = c - 0x61 + 26; else if(c >= 0x30 && c <= 0x39) // 0-9 res->uint = c - 0x30 + 52; else if(c == '+') res->uint = 62; else if(c == '/') res->uint = 63; return res; }
static HParsedToken *act_packed(const HParseResult *p, void *user) { DNP3_Object *o = H_ALLOC(DNP3_Object); o->bit = H_CAST_UINT(p->ast); return H_MAKE(DNP3_Object, o); }