void *Drone_new(size_t size, Drone proto, int *id) { // setup the default functions in case they aren't set if(!proto.init) proto.init = Drone_init; if(!proto.boot) proto.boot = Drone_boot; if(!proto.stand_by) proto.stand_by = Drone_stand_by; if(!proto.navigate) proto.navigate = Drone_navigate; if(!proto.pick_up) proto.pick_up = Drone_pick_up; if(!proto.lift_off) proto.lift_off = Drone_lift_off; if(!proto.deliver) proto.deliver= Drone_deliver; if(!proto.return_home) proto.return_home = Drone_return_home; if(!proto.land) proto.land = Drone_land; if(!proto.state) proto.state = Drone_state; // this seems weird, but we can make a struct of one size, // then point a different pointer at it to "cast" it Drone *el = calloc(1, size); *el = proto; // copy the id over el->id = *id; el->curr_state = 0; el->busy = 0; el->curr_x = 0; el->curr_y = 0; // initialize it with whatever init we were given if(!el->init(el)) { // looks like it didn't initialize properly el->destroy(el); return NULL; } else { // all done, we made an object of any type return el; } }