static void test_filter(void) { Rlist *list = NULL; for (int i = 0; i < 10; i++) { void *item = xmemdup(&i, sizeof(int)); RlistAppendAlien(&list, item); } assert_int_equal(10, RlistLen(list)); int mod_by = 0; RlistFilter(&list, is_even, &mod_by, free); assert_int_equal(5, RlistLen(list)); int i = 0; for (Rlist *rp = list; rp; rp = rp->next) { int *k = rp->item; assert_int_equal(i, *k); free(k); rp->item = NULL; i += 2; } RlistDestroy(list); }
static void AugmentMountInfo(Rlist **list, char *host, char *source, char *mounton, char *options) { Mount *entry = xcalloc(1, sizeof(Mount)); if (host) { entry->host = xstrdup(host); } if (source) { entry->source = xstrdup(source); } if (mounton) { entry->mounton = xstrdup(mounton); } if (options) { entry->options = xstrdup(options); } RlistAppendAlien(list, (void *) entry); }
static void PopulateAvailable(const char *arg) { Package *p = DeserializePackage(arg); PackagePattern *pattern = MatchSame(p); if (FindPackages(AVAILABLE_PACKAGES_FILE_NAME, pattern) != NULL) { fprintf(stderr, "Skipping already available package %s\n", SerializePackage(p)); return; } Rlist *available_packages = ReadPackageEntries(AVAILABLE_PACKAGES_FILE_NAME); RlistAppendAlien(&available_packages, p); SavePackages(AVAILABLE_PACKAGES_FILE_NAME, available_packages); }
static void test_filter_everything(void) { Rlist *list = NULL; for (int i = 1; i < 10; i += 2) { void *item = xmemdup(&i, sizeof(int)); RlistAppendAlien(&list, item); } assert_int_equal(5, RlistLen(list)); int mod_by = 0; RlistFilter(&list, is_even, &mod_by, free); assert_int_equal(0, RlistLen(list)); assert_true(list == NULL); }
static Rlist *FindPackages(const char *database_filename, PackagePattern *pattern) { Rlist *db = ReadPackageEntries(database_filename); Rlist *matching = NULL; Rlist *rp = NULL; for (rp = db; rp != NULL; rp = rp->next) { Package *package = (Package *) rp->item; if (MatchPackage(pattern, package)) { RlistAppendAlien(&matching, package); } } return matching; }
static Rlist *ReadPackageEntries(const char *database_filename) { FILE *packages_file = fopen(database_filename, "r"); Rlist *packages = NULL; if (packages_file != NULL) { char serialized_package[MAX_PACKAGE_ENTRY_LENGTH]; while (fscanf(packages_file, "%s\n", serialized_package) != EOF) { Package *package = DeserializePackage(serialized_package); RlistAppendAlien(&packages, package); } fclose(packages_file); } return packages; }
static void AddPackage(PackagePattern *pattern) { fprintf(stderr, "Trying to install all packages matching pattern %s\n", SerializePackagePattern(pattern)); Rlist *matching_available = FindPackages(AVAILABLE_PACKAGES_FILE_NAME, pattern); if (matching_available == NULL) { fprintf(stderr, "Unable to find any package matching %s\n", SerializePackagePattern(pattern)); exit(1); } Rlist *rp; for (rp = matching_available; rp; rp = rp->next) { Package *p = (Package *) rp->item; PackagePattern *pat = MatchAllVersions((Package *) rp->item); if (FindPackages(INSTALLED_PACKAGES_FILE_NAME, pat) != NULL) { fprintf(stderr, "Package %s is already installed.\n", SerializePackage(p)); exit(1); } } Rlist *installed_packages = ReadPackageEntries(INSTALLED_PACKAGES_FILE_NAME); for (rp = matching_available; rp; rp = rp->next) { Package *p = (Package *) rp->item; RlistAppendAlien(&installed_packages, p); fprintf(stderr, "Succesfully installed package %s\n", SerializePackage(p)); } SavePackages(INSTALLED_PACKAGES_FILE_NAME, installed_packages); exit(0); }