char comps_set_cmp(COMPS_Set *set1, COMPS_Set *set2) { unsigned int x, index; COMPS_Set *not_processed1, *not_processed2; COMPS_HSListItem *it; void *item;//, *tmpdata; char ret; int at; not_processed1 = comps_set_create(); not_processed2 = comps_set_create(); comps_set_init(not_processed1, &comps_set_index_clone, &comps_set_index_clone, &free, &comps_set_index_cmp); comps_set_init(not_processed2, &comps_set_index_clone, &comps_set_index_clone, &free, &comps_set_index_cmp); for (x = 0, it = set1->data->first; it!= NULL; it = it->next, x++) { comps_hslist_append(not_processed1->data, &x, 1); } for (x = 0, it = set2->data->first; it!= NULL; it = it->next, x++) { comps_hslist_append(not_processed2->data, &x, 1); } it = set1->data->first; index = 0; ret = 0; while (!comps_set_is_empty(not_processed1) && !comps_set_is_empty(not_processed2)) { if ((at = comps_set_at(set2, it->data)) != -1) { item = comps_set_remove(not_processed1, (void*)&index); free(item); item = comps_set_remove(not_processed2 , (void*)&at); free(item); //tmpdata = comps_hslist_data_at(set2->data, at); } else { ret = 2; break; } it = it->next; index++; if (it == NULL) break; } if (ret == 0) { if (comps_set_is_empty(not_processed1)) { /*if (comps_set_is_empty(not_processed2)) ret = 0;*/ if (!comps_set_is_empty(not_processed2)) ret = -1; } else { if (comps_set_is_empty(not_processed2)) ret = 1; else ret = 2; } } comps_set_destroy(¬_processed1); comps_set_destroy(¬_processed2); return ret; }
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; }