static area_t *dup_area (area_t * area) { area_t *retval = malloc (sizeof (area_t)); *retval = *area; switch (area->ty) { case AREA_UNION: retval->a.a_union[0] = dup_area (retval->a.a_union[0]); retval->a.a_union[1] = dup_area (retval->a.a_union[1]); break; default: break; } return retval; }
static dumb_ptr<area_t> dup_area(dumb_ptr<area_t> area) { dumb_ptr<area_t> retval = dumb_ptr<area_t>::make(); *retval = *area; switch (area->ty) { case AREA::UNION: retval->a.a_union[0] = dup_area(retval->a.a_union[0]); retval->a.a_union[1] = dup_area(retval->a.a_union[1]); break; default: break; } return retval; }
void magic_copy_var (val_t * dest, val_t * src) { *dest = *src; switch (dest->ty) { case TY_STRING: dest->v.v_string = strdup (dest->v.v_string); break; case TY_AREA: dest->v.v_area = dup_area (dest->v.v_area); break; default: break; } }