#include #include #include #include #include "lists.h" #include "packages.h" void * list_filter(const char * name, const char * version, struct list_item_base *b, unsigned int prefix) { struct list_item * t; /* This could be modified to do a sorted search */ if (!b) return NULL; for (t = b->start; t; t = t->next) { if (prefix) { if (strncmp(t->name, name, strlen(t->name)) == 0) { t->count++; return (void *) t; } } else { if (strcmp(t->name, name) == 0) { t->count++; return (void *) t; } } } return NULL; } struct list_item * insert_into_list(const char * name, const char * version, struct list_item_base *b) { int ret; struct list_item * t; struct list_item * new = malloc(sizeof(*new)); memset(new, 0, sizeof(*new)); new->count = 0; strncpy(new->name, name, PACKAGE_NAME_LENGTH); strncpy(new->version, version, PACKAGE_VERSION_LENGTH); if (b->start == NULL) { b->start = new; goto done; } ret = strncmp(name, b->start->name, PACKAGE_NAME_LENGTH); if (ret < 0) { new->next = b->start; b->start = new; new->prev = b->start; new->next->prev = new; goto done; } for (t = b->start; t; t = t->next) { if (t->next == NULL) { t->next = new; new->prev = t; new->next = NULL; goto done; } ret = strncmp(name, t->name, PACKAGE_NAME_LENGTH); if (ret > 0) { /* it is after t, check next */ ret = strncmp(name, t->next->name, PACKAGE_NAME_LENGTH); if (ret < 0) { /* stick it here */ new->next = t->next; new->prev = t; t->next = new; t->next->prev = t; goto done; } } if (ret == 0) { /* it is the same */ b->number_items--; free(new); new = t; goto done; } } done: b->number_items++; return new; } struct list_item_base * list_setup_base(void) { struct list_item_base * new_base = malloc(sizeof(*new_base)); new_base->number_items = 0; new_base->start = NULL; return new_base; } struct list_item_base * list_load(struct list_item_base * old_base, const char * filename, int report_error) { FILE * file; char buf[1024]; unsigned int ret; char name[PACKAGE_NAME_LENGTH]; char version[PACKAGE_VERSION_LENGTH]; struct list_item_base * base; if (old_base) base = old_base; else base = list_setup_base(); if ((file = fopen(filename, "r")) == NULL) { if (report_error) printf("Opening list file %s: %s\n", filename, strerror(errno)); return NULL; } while (fgets(buf, sizeof(buf), file)) { if (buf[0] == '#') /* skip comments */ continue; ret = sscanf(buf, "%s %s", name, version); switch (ret) { case 1: /* just a name */ insert_into_list(name, "", base); break; case 2: /* we have a version number with it */ insert_into_list(name, version, base); break; default: /* skip line */ break; } } fclose(file); return base; }