void comps_objrtree_copy(COMPS_ObjRTree *rt1, COMPS_ObjRTree *rt2) { COMPS_HSList *to_clone, *tmplist, *new_subnodes; COMPS_HSListItem *it, *it2; COMPS_ObjRTreeData *rtdata; COMPS_Object *new_data; rt1->subnodes = comps_hslist_create(); comps_hslist_init(rt1->subnodes, NULL, NULL, &comps_objrtree_data_destroy_v); if (rt1->subnodes == NULL) { COMPS_OBJECT_DESTROY(rt1); return; } rt1->len = 0; to_clone = comps_hslist_create(); comps_hslist_init(to_clone, NULL, NULL, NULL); for (it = rt2->subnodes->first; it != NULL; it = it->next) { rtdata = comps_objrtree_data_create( ((COMPS_ObjRTreeData*)it->data)->key, NULL); if (((COMPS_ObjRTreeData*)it->data)->data != NULL) new_data = comps_object_copy(((COMPS_ObjRTreeData*)it->data)->data); else new_data = NULL; comps_hslist_destroy(&rtdata->subnodes); rtdata->subnodes = ((COMPS_ObjRTreeData*)it->data)->subnodes; rtdata->data = new_data; comps_hslist_append(rt1->subnodes, rtdata, 0); comps_hslist_append(to_clone, rtdata, 0); } while (to_clone->first) { it2 = to_clone->first; tmplist = ((COMPS_ObjRTreeData*)it2->data)->subnodes; comps_hslist_remove(to_clone, to_clone->first); new_subnodes = comps_hslist_create(); comps_hslist_init(new_subnodes, NULL, NULL, &comps_objrtree_data_destroy_v); for (it = tmplist->first; it != NULL; it = it->next) { rtdata = comps_objrtree_data_create( ((COMPS_ObjRTreeData*)it->data)->key, NULL); if (((COMPS_ObjRTreeData*)it->data)->data != NULL) new_data = comps_object_copy(((COMPS_ObjRTreeData*)it->data)->data); else new_data = NULL; comps_hslist_destroy(&rtdata->subnodes); rtdata->subnodes = ((COMPS_ObjRTreeData*)it->data)->subnodes; rtdata->data = new_data; comps_hslist_append(new_subnodes, rtdata, 0); comps_hslist_append(to_clone, rtdata, 0); } ((COMPS_ObjRTreeData*)it2->data)->subnodes = new_subnodes; free(it2); } comps_hslist_destroy(&to_clone); }
static void comps_docpackage_copy(COMPS_DocGroupPackage *pkg_dst, COMPS_DocGroupPackage *pkg_src) { pkg_dst->name = (COMPS_Str*)comps_object_copy((COMPS_Object*)pkg_src->name); pkg_dst->requires = (COMPS_Str*)comps_object_copy( (COMPS_Object*)pkg_src->requires); pkg_dst->basearchonly = (COMPS_Num*)comps_object_copy( (COMPS_Object*)pkg_src->basearchonly); pkg_dst->arches = (COMPS_ObjList*)comps_object_copy( (COMPS_Object*)pkg_src->arches); pkg_dst->type = pkg_src->type; }
void comps_docgroup_copy(COMPS_DocGroup *group_dst, COMPS_DocGroup *group_src) { group_dst->properties = (COMPS_ObjDict*)comps_object_copy( (COMPS_Object*)group_src->properties); group_dst->name_by_lang = (COMPS_ObjDict*)comps_object_copy( (COMPS_Object*)group_src->name_by_lang); group_dst->desc_by_lang = (COMPS_ObjDict*)comps_object_copy( (COMPS_Object*)group_src->desc_by_lang); group_dst->packages = (COMPS_ObjList*)comps_object_copy( (COMPS_Object*)group_src->packages); }
COMPS_ObjList* comps_envs_union(COMPS_ObjList *envs1, COMPS_ObjList *envs2) { COMPS_ObjListIt *it; COMPS_Set *set; COMPS_DocEnv *tmpenv; COMPS_ObjList *ret; void *data; int index; ret = COMPS_OBJECT_CREATE(COMPS_ObjList, NULL); set = comps_set_create(); comps_set_init(set, NULL, NULL, &comps_object_destroy_v, &__comps_docenv_idcmp); for (it = envs1 ? envs1->first : NULL; it != NULL; it = it->next) { tmpenv = (COMPS_DocEnv*) comps_object_copy(it->comps_obj); comps_set_add(set, tmpenv); comps_objlist_append(ret, (COMPS_Object*)tmpenv); } for (it = envs2 ? envs2->first : NULL; it != NULL; it = it->next) { if ((data = comps_set_data_at(set, it->comps_obj)) != NULL) { index = comps_objlist_index(ret, data); comps_objlist_remove_at(ret, index); tmpenv = comps_docenv_union((COMPS_DocEnv*)data, (COMPS_DocEnv*)it->comps_obj); comps_objlist_insert_at_x(ret, index, (COMPS_Object*)tmpenv); } else { comps_objlist_append(ret, it->comps_obj); } } comps_set_destroy(&set); return ret; }
COMPS_DocCategory* comps_doccategory_union(COMPS_DocCategory *c1, COMPS_DocCategory *c2) { COMPS_DocCategory *res; COMPS_ObjListIt *it; COMPS_Set *set; COMPS_Object *obj; void *data; int index; res = COMPS_OBJECT_CREATE(COMPS_DocCategory,NULL); COMPS_OBJECT_DESTROY(res->properties); res->properties = comps_objdict_union(c1->properties, c2->properties); set = comps_set_create(); comps_set_init(set, NULL, NULL, &comps_object_destroy_v, &__comps_docgroupid_cmp_set); it = c1->group_ids?c1->group_ids->first:NULL; for (; it != NULL; it = it->next) { obj = comps_object_copy(it->comps_obj); comps_set_add(set, (void*)comps_object_incref(obj)); comps_doccategory_add_groupid(res, (COMPS_DocGroupId*)obj); } it = c2->group_ids ? c2->group_ids->first : NULL; for (; it != NULL; it = it->next) { if ((data = comps_set_data_at(set, (void*)it->comps_obj)) != NULL) { index = comps_objlist_index(res->group_ids, (COMPS_Object*)data); comps_objlist_remove_at(res->group_ids, index); comps_objlist_insert_at_x(res->group_ids, index, comps_object_copy(it->comps_obj)); } else { comps_doccategory_add_groupid(res, (COMPS_DocGroupId*) comps_object_copy(it->comps_obj)); } } comps_set_destroy(&set); COMPS_OBJECT_DESTROY(res->name_by_lang); COMPS_OBJECT_DESTROY(res->desc_by_lang); res->name_by_lang = comps_objdict_union(c1->name_by_lang, c2->name_by_lang); res->desc_by_lang = comps_objdict_union(c1->desc_by_lang, c2->desc_by_lang); return res; }
COMPS_DocGroup* comps_docgroup_union(COMPS_DocGroup *g1, COMPS_DocGroup *g2) { COMPS_DocGroup *res; COMPS_ObjListIt *it; COMPS_Set *set; COMPS_DocGroupPackage *pkg; res = COMPS_OBJECT_CREATE(COMPS_DocGroup, NULL); COMPS_OBJECT_DESTROY(res->properties); res->properties = comps_objdict_union(g1->properties, g2->properties); set = comps_set_create(); comps_set_init(set, NULL, NULL, (void(*)(void*))&comps_object_destroy, &comps_docpackage_cmp_set); it = g1->packages?g1->packages->first:NULL; for (; it != NULL; it = it->next) { pkg = (COMPS_DocGroupPackage*) comps_object_copy(it->comps_obj); comps_set_add(set, (void*)comps_object_incref((COMPS_Object*)pkg)); comps_docgroup_add_package(res, pkg); } void *data; int index; it = g2->packages?g2->packages->first:NULL; for (; it != NULL; it = it->next) { if ((data = comps_set_data_at(set, (void*)it->comps_obj)) != NULL) { index = comps_objlist_index(res->packages, (COMPS_Object*)data); comps_objlist_remove_at(res->packages, index); comps_objlist_insert_at_x(res->packages, index, comps_object_copy(it->comps_obj)); } else { comps_docgroup_add_package(res, (COMPS_DocGroupPackage*) comps_object_copy(it->comps_obj)); } } comps_set_destroy(&set); comps_object_destroy((COMPS_Object*)res->name_by_lang); comps_object_destroy((COMPS_Object*)res->desc_by_lang); res->name_by_lang = comps_objdict_union(g1->name_by_lang, g2->name_by_lang); res->desc_by_lang = comps_objdict_union(g1->desc_by_lang, g2->desc_by_lang); return res; }
COMPS_ObjList* comps_groups_union(COMPS_ObjList *groups1, COMPS_ObjList *groups2) { COMPS_HSListItem *hsit; COMPS_Set *set; COMPS_ObjList *ret; COMPS_DocGroup *tmpgroup; COMPS_ObjListIt *it; void *tmpdata; ret = (COMPS_ObjList*)comps_object_create(&COMPS_ObjList_ObjInfo, NULL); set = comps_set_create(); comps_set_init(set, NULL, NULL, NULL, &__comps_docgroup_idcmp); for (it = groups1 ? groups1->first : NULL; it != NULL; it = it->next) { comps_set_add(set, comps_object_copy(it->comps_obj)); } for (it = groups2 ? groups2->first : NULL; it != NULL; it = it->next) { if (comps_set_in(set, it->comps_obj)) { tmpgroup = comps_docgroup_union( (COMPS_DocGroup*)it->comps_obj, (COMPS_DocGroup*)comps_set_data_at(set, it->comps_obj)); tmpdata = comps_set_data_at(set, it->comps_obj); comps_set_remove(set, it->comps_obj); comps_object_destroy((COMPS_Object*)tmpdata); comps_set_add(set, tmpgroup); } else { comps_set_add(set, comps_object_copy(it->comps_obj)); } } for (hsit = set->data->first; hsit != NULL; hsit = hsit->next) { comps_objlist_append_x(ret, (COMPS_Object*)hsit->data); } comps_set_destroy(&set); return ret; }
COMPS_DocGroup* comps_docgroup_intersect(COMPS_DocGroup *g1, COMPS_DocGroup *g2) { COMPS_DocGroup *res; COMPS_ObjListIt *it; COMPS_HSListItem *hsit; COMPS_Set *set; COMPS_DocGroupPackage *newpkg; COMPS_HSList *pairs1, *pairs2; res = COMPS_OBJECT_CREATE(COMPS_DocGroup, NULL); set = comps_set_create(); //comps_objrtree_paircmp(void *obj1, void *obj2) { comps_set_init(set, NULL, NULL, NULL, &comps_objrtree_paircmp); pairs1 = comps_objdict_pairs(g1->properties); for (hsit = pairs1->first; hsit != NULL; hsit = hsit->next) { comps_set_add(set, hsit->data); } pairs2 = comps_objdict_pairs(g2->properties); for (hsit = pairs2->first; hsit != NULL; hsit = hsit->next) { if (comps_set_in(set, hsit->data)) { comps_objdict_set(res->properties, ((COMPS_RTreePair*)hsit->data)->key, ((COMPS_RTreePair*)hsit->data)->data); } } comps_hslist_destroy(&pairs1); comps_hslist_destroy(&pairs2); comps_set_clear(set); //res->packages = (COMPS_ObjList*)comps_object_create(&COMPS_ObjList_ObjInfo, // NULL); //set = comps_set_create(); comps_set_init(set, NULL, NULL, NULL, &comps_docpackage_cmp_set); for (it = g1->packages->first; it != NULL; it = it->next) { comps_set_add(set, it->comps_obj); } for (it = g2->packages->first; it != NULL; it = it->next) { if (comps_set_in(set, it->comps_obj)) { newpkg = (COMPS_DocGroupPackage*) comps_object_copy(it->comps_obj); comps_docgroup_add_package(res, newpkg); } } comps_set_destroy(&set); return res; }
COMPS_DocCategory* comps_doccategory_intersect(COMPS_DocCategory *c1, COMPS_DocCategory *c2) { COMPS_DocCategory *res; COMPS_ObjListIt *it; COMPS_HSListItem *hsit; COMPS_Set *set; COMPS_HSList *pairs1, *pairs2; res = COMPS_OBJECT_CREATE(COMPS_DocCategory, NULL); set = comps_set_create(); comps_set_init(set, NULL, NULL, NULL, &comps_objrtree_paircmp); pairs1 = comps_objdict_pairs(c1->properties); for (hsit = pairs1->first; hsit != NULL; hsit = hsit->next) { comps_set_add(set, hsit->data); } pairs2 = comps_objdict_pairs(c2->properties); for (hsit = pairs2->first; hsit != NULL; hsit = hsit->next) { if (comps_set_in(set, hsit->data)) { comps_objdict_set(res->properties, ((COMPS_RTreePair*)hsit->data)->key, ((COMPS_RTreePair*)hsit->data)->data); } } comps_hslist_destroy(&pairs1); comps_hslist_destroy(&pairs2); comps_set_clear(set); comps_set_init(set, NULL, NULL, NULL, &__comps_docgroupid_cmp_set); for (it = c1->group_ids->first; it != NULL; it = it->next) { comps_set_add(set, it->comps_obj); } for (it = c2->group_ids->first; it != NULL; it = it->next) { if (comps_set_in(set, it->comps_obj)) { comps_doccategory_add_groupid(res, (COMPS_DocGroupId*)comps_object_copy(it->comps_obj)); } } comps_set_destroy(&set); return res; }
void comps_docgroupid_copy(COMPS_DocGroupId *gid_dst, COMPS_DocGroupId *gid_src) { gid_dst->name = (COMPS_Str*)comps_object_copy((COMPS_Object*)gid_src->name); gid_dst->arches = (COMPS_ObjList*)comps_object_copy((COMPS_Object*)gid_src->arches); gid_dst->def = gid_src->def; }