static void add_child(prop_reorder_t *pr, prop_t *p) { prop_t *out = prop_make(NULL, 0, NULL); prop_tag_set(p, pr, out); prop_link0(p, out, NULL, 0, 0); prop_set_parent0(out, pr->pr_dst, get_before(pr, get_id(p)), NULL); }
static void src_cb(void *opaque, prop_event_t event, ...) { prop_concat_source_t *pcs = opaque; prop_concat_t *pc = pcs->pcs_pc; prop_t *p, *q, *out, *before; va_list ap; va_start(ap, event); switch(event) { case PROP_ADD_CHILD: p = va_arg(ap, prop_t *); out = prop_create_root(NULL); prop_tag_set(p, pcs, out); prop_link0(p, out, NULL, 0); prop_set_parent0(out, pc->pc_dst, find_next_out(pcs), NULL); if(pcs->pcs_count == 0) { pcs->pcs_first = out; if(pcs->pcs_header != NULL) prop_set_parent0(pcs->pcs_header, pc->pc_dst, out, NULL); } pcs->pcs_count++; break; case PROP_ADD_CHILD_BEFORE: p = va_arg(ap, prop_t *); out = prop_create_root(NULL); prop_tag_set(p, pcs, out); prop_link0(p, out, NULL, 0); q = va_arg(ap, prop_t *); before = prop_tag_get(q, pcs); assert(before != NULL); prop_set_parent0(out, pc->pc_dst, before, NULL); pcs->pcs_count++; break; case PROP_DEL_CHILD: p = va_arg(ap, prop_t *); out = prop_tag_clear(p, pcs); before = TAILQ_NEXT(out, hp_parent_link); prop_destroy0(out); pcs->pcs_count--; if(pcs->pcs_count == 0) { pcs->pcs_first = NULL; if(pcs->pcs_header != NULL) prop_unparent0(pcs->pcs_header, NULL); } else if(pcs->pcs_first == out) { pcs->pcs_first = before; } break; case PROP_MOVE_CHILD: p = va_arg(ap, prop_t *); q = va_arg(ap, prop_t *); prop_move0(prop_tag_get(p, pcs), q != NULL ? prop_tag_get(q, pcs) : find_next_out(pcs), NULL); break; case PROP_SET_VOID: break; case PROP_SET_DIR: case PROP_REQ_DELETE_VECTOR: case PROP_HAVE_MORE_CHILDS: case PROP_WANT_MORE_CHILDS: break; default: printf("Cant handle event %d\n", event); abort(); } }