Add a package iterator for iterating through property owners.
authorKristian Høgsberg <krh@redhat.com>
Fri, 18 Jan 2008 04:28:37 +0000 (23:28 -0500)
committerKristian Høgsberg <krh@redhat.com>
Fri, 18 Jan 2008 04:28:37 +0000 (23:28 -0500)
main.c
razor.c
razor.h

diff --git a/main.c b/main.c
index a39c19f..af58fa4 100644 (file)
--- a/main.c
+++ b/main.c
@@ -136,6 +136,20 @@ command_list_package_files(int argc, const char *argv[])
        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 @@ list_property_packages(const char *ref_name,
                if (ref_type != type)
                        continue;
 
-               razor_set_list_property_packages(set, property);
+               list_packages_for_property(set, property);
        }
        razor_property_iterator_destroy(pi);
 
diff --git a/razor.c b/razor.c
index 250e383..7a8927f 100644 (file)
--- a/razor.c
+++ b/razor.c
@@ -938,34 +938,75 @@ razor_importer_finish(struct razor_importer *importer)
 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->package = set->packages.data;
        pi->end = set->packages.data + set->packages.size;
+       pi->package = set->packages.data;
+       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 @@ razor_property_iterator_create(struct razor_set *set,
        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 @@ razor_property_iterator_destroy(struct razor_property_iterator *pi)
        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 --git a/razor.h b/razor.h
index 92ff6d8..e9f37fc 100644 (file)
--- a/razor.h
+++ b/razor.h
@@ -25,6 +25,9 @@ razor_set_get_package(struct razor_set *set, const char *package);
 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 @@ int razor_property_iterator_next(struct razor_property_iterator *pi,
 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);