# HG changeset patch # User Kristian H?gsberg # Date 1200630517 18000 # Node ID 9708f6d5db8c675601b75854206084ce2007b7b4 # Parent 27aada3268588efd8553cd1481af1af2bc931a55 Add a package iterator for iterating through property owners. diff -r 27aada326858 -r 9708f6d5db8c main.c --- a/main.c Thu Jan 10 23:42:42 2008 -0500 +++ b/main.c Thu Jan 17 23:28:37 2008 -0500 @@ -136,6 +136,20 @@ return 0; } +static void +list_packages_for_property(struct razor_set *set, + struct razor_property *property) +{ + struct razor_package_iterator *pi; + struct razor_package *package; + const char *name, *version; + + pi = razor_package_iterator_create_for_property(set, property); + while (razor_package_iterator_next(pi, &package, &name, &version)) + printf("%s-%s\n", name, version); + razor_package_iterator_destroy(pi); +} + static int list_property_packages(const char *ref_name, const char *ref_version, @@ -164,7 +178,7 @@ if (ref_type != type) continue; - razor_set_list_property_packages(set, property); + list_packages_for_property(set, property); } razor_property_iterator_destroy(pi); diff -r 27aada326858 -r 9708f6d5db8c razor.c --- a/razor.c Thu Jan 10 23:42:42 2008 -0500 +++ b/razor.c Thu Jan 17 23:28:37 2008 -0500 @@ -938,34 +938,75 @@ struct razor_package_iterator { struct razor_set *set; struct razor_package *package, *end; + unsigned long *index; + int last; }; struct razor_package_iterator * -razor_package_iterator_create(struct razor_set *set) +razor_package_iterator_create_with_index(struct razor_set *set, + unsigned long *index) { struct razor_package_iterator *pi; pi = zalloc(sizeof *pi); pi->set = set; + pi->end = set->packages.data + set->packages.size; pi->package = set->packages.data; - pi->end = set->packages.data + set->packages.size; + pi->index = index; return pi; } +struct razor_package_iterator * +razor_package_iterator_create(struct razor_set *set) +{ + return razor_package_iterator_create_with_index(set, NULL); +} + +struct razor_package_iterator * +razor_package_iterator_create_for_property(struct razor_set *set, + struct razor_property *property) +{ + unsigned long *index; + + if (property->packages & RAZOR_IMMEDIATE) + index = &property->packages; + else + index = (unsigned long *) + set->package_pool.data + property->packages; + + return razor_package_iterator_create_with_index(set, index); +} + int razor_package_iterator_next(struct razor_package_iterator *pi, struct razor_package **package, const char **name, const char **version) { char *pool; + int valid; + struct razor_package *p, *packages; - pool = pi->set->string_pool.data; - *package = pi->package; - *name = &pool[pi->package->name]; - *version = &pool[pi->package->version]; + if (pi->index) { + packages = pi->set->packages.data; + p = &packages[*pi->index & RAZOR_ENTRY_MASK]; + valid = !pi->last; + pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0; + } else { + p = pi->package++; + valid = p < pi->end; + } - return pi->package++ < pi->end; + if (valid) { + pool = pi->set->string_pool.data; + *package = p; + *name = &pool[p->name & RAZOR_ENTRY_MASK]; + *version = &pool[p->version]; + } else { + *package = NULL; + } + + return valid; } void @@ -1007,12 +1048,11 @@ pi = zalloc(sizeof *pi); pi->set = set; pi->end = set->properties.data + set->properties.size; + pi->property = set->properties.data; if (package) pi->index = (unsigned long *) set->property_pool.data + package->properties; - else - pi->property = set->properties.data; return pi; } @@ -1056,32 +1096,6 @@ free(pi); } -void -razor_set_list_property_packages(struct razor_set *set, - struct razor_property *property) -{ - struct razor_package *p, *packages; - const char *pool; - unsigned long *r; - - packages = set->packages.data; - pool = set->string_pool.data; - - if (property->packages & RAZOR_IMMEDIATE) - r = &property->packages; - else - r = (unsigned long *) - set->package_pool.data + property->packages; - while (1) { - p = &packages[*r & RAZOR_ENTRY_MASK]; - printf("%s-%s\n", - &pool[p->name & RAZOR_ENTRY_MASK], - &pool[p->version]); - if (*r++ & RAZOR_IMMEDIATE) - break; - } -} - static struct razor_entry * find_entry(struct razor_set *set, struct razor_entry *dir, const char *pattern) { diff -r 27aada326858 -r 9708f6d5db8c razor.h --- a/razor.h Thu Jan 10 23:42:42 2008 -0500 +++ b/razor.h Thu Jan 17 23:28:37 2008 -0500 @@ -25,6 +25,9 @@ struct razor_package_iterator; struct razor_package_iterator * razor_package_iterator_create(struct razor_set *set); +struct razor_package_iterator * +razor_package_iterator_create_for_property(struct razor_set *set, + struct razor_property *property); int razor_package_iterator_next(struct razor_package_iterator *pi, struct razor_package **package, @@ -42,12 +45,6 @@ void razor_property_iterator_destroy(struct razor_property_iterator *pi); - -void razor_set_list_properties(struct razor_set *set, const char *name, - enum razor_property_type type); -void razor_set_list_property_packages(struct razor_set *set, - struct razor_property *property); - void razor_set_list_files(struct razor_set *set, const char *prefix); void razor_set_list_file_packages(struct razor_set *set, const char *filename); void razor_set_list_package_files(struct razor_set *set, const char *name);