// Adds 'parent' as a sire or dam of 'child' // after checking for re-parentage and cycles. void add_parent(CatID child, CatID parent) { // Update Child Pointers int childPointer = getCat(child); if (childPointer == NIL) { childPointer = nextFreeCat(); cats[childPointer].tableEntry = child; // EDIT ME symTable[child] = childPointer; } // check for re-parentage if (is_male(parent) ? cats[childPointer].sire != NIL : cats[childPointer].dam != NIL) { printf("Input ignored: %d already has a %s.\n", child, is_male(parent) ? "sire" : "dam"); return; } // Update Parent Pointers int parentPointer = getCat(parent); // printf("%d\n", parentPointer); if (parentPointer == NIL) { parentPointer = nextFreeCat(); cats[parentPointer].tableEntry = parent; // EDIT ME symTable[parent] = parentPointer; } // check for cycles if (is_ancestor(parent, child)) { printf("Input ignored: it would cause cycle\n"); return; } // set parent pointer if (is_male(parent)) cats[childPointer].sire = parentPointer; else cats[childPointer].dam = parentPointer; // set child pointer if (cats[parentPointer].eldest_child == NIL) { // this is first child to be added assert(cats[parentPointer].youngest_child == NIL); cats[parentPointer].eldest_child = childPointer; cats[parentPointer].youngest_child = childPointer; } else { // this is not the first child to be added CatID youngest_child = cats[parentPointer].youngest_child; assert(youngest_child != NIL); if (is_male(parent)) { assert(cats[youngest_child].next_younger_by_sire == NIL); cats[youngest_child].next_younger_by_sire = childPointer; } else { assert(cats[youngest_child].next_younger_by_dam == NIL); cats[youngest_child].next_younger_by_dam = childPointer; } cats[parentPointer].youngest_child = childPointer; } }
// Prints the descendants of 'cat' down to 'max_depth'. void query_descendants(CatID cat, int max_depth) { cat = getCat(cat); mark_descendants(cat, max_depth, 0); print_descendants(cat, cat, max_depth, 0); clear_descendants(cat, max_depth, 0); }
// Prints all closest relationships between 'cat1' and 'cat2'. void query_relationship(CatID cat1, CatID cat2) { //printf("%d %d\n", cat1, cat2); cat1 = getCat(cat1); cat2 = getCat(cat2); //printf("cat1: %d %d cat2: %d %d \n", cats[cat1].tableEntry, cat1, cats[cat2].tableEntry, cat2); mark_ancestors(cat1, 0); int relationship = find_minimum_relationship(cat2, 0); if (relationship == COUNTER_SENTINEL) { //printf("%d-%d is not related to %d-%d.\n", cats[cat1].tableEntry, cat1, cats[cat2].tableEntry, cat2); printf("%d is not related to %d.\n", cats[cat1].tableEntry, cats[cat2].tableEntry); printf(" eldest_child: %d.\n", cats[cat1].eldest_child); printf(" par: %d.\n", cats[cats[cat1].sire].tableEntry); printf(" par: %d.\n", cats[cats[cat1].dam].tableEntry); } else { print_relationship_at_distance(cat1, cat2, cat2, relationship, 0); } clear_ancestors(cat1); }
// Function called for each part (ex. 3@1) of the save command void save_descendants(int cat, int lvl) { cat = getCat(cat); int damCat = getTopCat(cat, lvl); //printf("%d cat, %d damCat, %d lvl(s)\n", cats[cat].tableEntry, cats[damCat].tableEntry, lvl); // EXTRA //cats[cat].counter = COUNTER_SENTINEL; //cats[toSpacePointer] = cats[cat]; //symTable[ cats[cat].tableEntry ] = toSpacePointer; // EXTRA /* damCat = move_saved_dam(toSpacePointer, damCat); int eldestCat = move_saved_cats(damCat); cats[damCat].eldest_child = eldestCat; */ int eldestCat = -1; if (cats[damCat].eldest_child != NIL) { eldestCat = move_saved_cats(cats[damCat].eldest_child); } damCat = move_saved_dam(toSpacePointer, damCat); cats[damCat].eldest_child = eldestCat; if (is_male(damCat)) cats[eldestCat].sire = damCat; else cats[eldestCat].dam = damCat; if (catMemory == 0) { toSpacePointer = 0; catMemory = NUM_CATS; memoryEnd = NUM_CATS * 2; } else { toSpacePointer = NUM_CATS; catMemory = 0; memoryEnd = NUM_CATS; } //printf("getCat %d | getTopCat %d\n", cat, damCat); setSoftLinks(damCat); }
bool search(downloadtype type, category cat, const char* name, std::list<IDownload*>& searchres) { IDownload::category icat = getCat(cat); if (isEngineDownload(icat)) { //engine downloads only work with http type = DL_ENGINE; LOG_ERROR("engine dl"); } typ = type; std::string searchname = name; switch(type) { case DL_RAPID: return rapidDownload->search(searchres, searchname.c_str(), icat); case DL_HTTP: case DL_ENGINE: return httpDownload->search(searchres, searchname.c_str(), icat); case DL_PLASMA: return plasmaDownload->search(searchres, searchname.c_str(), icat); case DL_ANY: rapidDownload->search(searchres, searchname.c_str(), icat); if (!searchres.empty()) { typ = DL_RAPID; break; } typ = DL_HTTP; httpDownload->search(searchres, searchname.c_str(), icat); if (!searchres.empty()) { break; } //last try, use plasma return plasmaDownload->search(searchres, searchname.c_str(), icat); default: LOG_ERROR("%s: type invalid", __FUNCTION__); return false; } return true; }