void fix_mixer_dependencies(unsigned mixer_count) { unsigned dependencies[NUM_SOURCES]; unsigned placed[NUM_SOURCES]; unsigned pos = 0; unsigned last_count = 0; unsigned i; struct Mixer mixers[NUM_MIXERS]; memset(mixers, 0, sizeof(mixers)); for (i = 0; i < NUM_MIXERS; i++) { mixers[i].src = 0; } memset(placed, 0, sizeof(placed)); while(mixer_count || last_count != mixer_count) { last_count = mixer_count; for (i = 0; i < NUM_SOURCES; i++) { if (placed[i]) continue; if (! find_dependencies(i, dependencies)) { placed[i] = 1; continue; } unsigned ok = 1; unsigned j; // determine if all dependencies have been placed for (j = 0; j < NUM_SOURCES; j++) { if (dependencies[i] && ! placed[i]) { ok = 0; break; } } if (ok) { unsigned num = MIXER_GetMixers(i, &mixers[pos], NUM_MIXERS); pos += num; mixer_count -= num; placed[i] = 1; } } } //mixer_count s gauranteed to be 0 when we get here //if (mixer_count) { // printf("Could not place all mixers!\n"); // return; //} for (i = 0; i < NUM_MIXERS; i++) Model.mixers[i] = mixers[i]; }
struct pkglist *get_dependencies(char *name) { struct pkglist *p = NULL; char *repo, *version; int i = -10; if (pkglist_exists(name, ilenia_ports) == 0) { repo = pkglist_get_newer_favorite(name, REGULAR); version = pkglist_get_from_repo(name, repo, ilenia_ports); p = pkglist_add_reversed(name, version, repo, NULL, p); while (i != pkglist_len(p)) { i = pkglist_len(p); p = find_dependencies(p); } } else { p = pkglist_add(name, "", "not found", NULL, p); } return (p); }