Add a package iterator for iterating through property owners.
1.1 --- a/main.c Thu Jan 10 23:42:42 2008 -0500
1.2 +++ b/main.c Thu Jan 17 23:28:37 2008 -0500
1.3 @@ -136,6 +136,20 @@
1.4 return 0;
1.5 }
1.6
1.7 +static void
1.8 +list_packages_for_property(struct razor_set *set,
1.9 + struct razor_property *property)
1.10 +{
1.11 + struct razor_package_iterator *pi;
1.12 + struct razor_package *package;
1.13 + const char *name, *version;
1.14 +
1.15 + pi = razor_package_iterator_create_for_property(set, property);
1.16 + while (razor_package_iterator_next(pi, &package, &name, &version))
1.17 + printf("%s-%s\n", name, version);
1.18 + razor_package_iterator_destroy(pi);
1.19 +}
1.20 +
1.21 static int
1.22 list_property_packages(const char *ref_name,
1.23 const char *ref_version,
1.24 @@ -164,7 +178,7 @@
1.25 if (ref_type != type)
1.26 continue;
1.27
1.28 - razor_set_list_property_packages(set, property);
1.29 + list_packages_for_property(set, property);
1.30 }
1.31 razor_property_iterator_destroy(pi);
1.32
2.1 --- a/razor.c Thu Jan 10 23:42:42 2008 -0500
2.2 +++ b/razor.c Thu Jan 17 23:28:37 2008 -0500
2.3 @@ -938,34 +938,75 @@
2.4 struct razor_package_iterator {
2.5 struct razor_set *set;
2.6 struct razor_package *package, *end;
2.7 + unsigned long *index;
2.8 + int last;
2.9 };
2.10
2.11 struct razor_package_iterator *
2.12 -razor_package_iterator_create(struct razor_set *set)
2.13 +razor_package_iterator_create_with_index(struct razor_set *set,
2.14 + unsigned long *index)
2.15 {
2.16 struct razor_package_iterator *pi;
2.17
2.18 pi = zalloc(sizeof *pi);
2.19 pi->set = set;
2.20 + pi->end = set->packages.data + set->packages.size;
2.21 pi->package = set->packages.data;
2.22 - pi->end = set->packages.data + set->packages.size;
2.23 + pi->index = index;
2.24
2.25 return pi;
2.26 }
2.27
2.28 +struct razor_package_iterator *
2.29 +razor_package_iterator_create(struct razor_set *set)
2.30 +{
2.31 + return razor_package_iterator_create_with_index(set, NULL);
2.32 +}
2.33 +
2.34 +struct razor_package_iterator *
2.35 +razor_package_iterator_create_for_property(struct razor_set *set,
2.36 + struct razor_property *property)
2.37 +{
2.38 + unsigned long *index;
2.39 +
2.40 + if (property->packages & RAZOR_IMMEDIATE)
2.41 + index = &property->packages;
2.42 + else
2.43 + index = (unsigned long *)
2.44 + set->package_pool.data + property->packages;
2.45 +
2.46 + return razor_package_iterator_create_with_index(set, index);
2.47 +}
2.48 +
2.49 int
2.50 razor_package_iterator_next(struct razor_package_iterator *pi,
2.51 struct razor_package **package,
2.52 const char **name, const char **version)
2.53 {
2.54 char *pool;
2.55 + int valid;
2.56 + struct razor_package *p, *packages;
2.57
2.58 - pool = pi->set->string_pool.data;
2.59 - *package = pi->package;
2.60 - *name = &pool[pi->package->name];
2.61 - *version = &pool[pi->package->version];
2.62 + if (pi->index) {
2.63 + packages = pi->set->packages.data;
2.64 + p = &packages[*pi->index & RAZOR_ENTRY_MASK];
2.65 + valid = !pi->last;
2.66 + pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0;
2.67 + } else {
2.68 + p = pi->package++;
2.69 + valid = p < pi->end;
2.70 + }
2.71
2.72 - return pi->package++ < pi->end;
2.73 + if (valid) {
2.74 + pool = pi->set->string_pool.data;
2.75 + *package = p;
2.76 + *name = &pool[p->name & RAZOR_ENTRY_MASK];
2.77 + *version = &pool[p->version];
2.78 + } else {
2.79 + *package = NULL;
2.80 + }
2.81 +
2.82 + return valid;
2.83 }
2.84
2.85 void
2.86 @@ -1007,12 +1048,11 @@
2.87 pi = zalloc(sizeof *pi);
2.88 pi->set = set;
2.89 pi->end = set->properties.data + set->properties.size;
2.90 + pi->property = set->properties.data;
2.91
2.92 if (package)
2.93 pi->index = (unsigned long *)
2.94 set->property_pool.data + package->properties;
2.95 - else
2.96 - pi->property = set->properties.data;
2.97
2.98 return pi;
2.99 }
2.100 @@ -1056,32 +1096,6 @@
2.101 free(pi);
2.102 }
2.103
2.104 -void
2.105 -razor_set_list_property_packages(struct razor_set *set,
2.106 - struct razor_property *property)
2.107 -{
2.108 - struct razor_package *p, *packages;
2.109 - const char *pool;
2.110 - unsigned long *r;
2.111 -
2.112 - packages = set->packages.data;
2.113 - pool = set->string_pool.data;
2.114 -
2.115 - if (property->packages & RAZOR_IMMEDIATE)
2.116 - r = &property->packages;
2.117 - else
2.118 - r = (unsigned long *)
2.119 - set->package_pool.data + property->packages;
2.120 - while (1) {
2.121 - p = &packages[*r & RAZOR_ENTRY_MASK];
2.122 - printf("%s-%s\n",
2.123 - &pool[p->name & RAZOR_ENTRY_MASK],
2.124 - &pool[p->version]);
2.125 - if (*r++ & RAZOR_IMMEDIATE)
2.126 - break;
2.127 - }
2.128 -}
2.129 -
2.130 static struct razor_entry *
2.131 find_entry(struct razor_set *set, struct razor_entry *dir, const char *pattern)
2.132 {
3.1 --- a/razor.h Thu Jan 10 23:42:42 2008 -0500
3.2 +++ b/razor.h Thu Jan 17 23:28:37 2008 -0500
3.3 @@ -25,6 +25,9 @@
3.4 struct razor_package_iterator;
3.5 struct razor_package_iterator *
3.6 razor_package_iterator_create(struct razor_set *set);
3.7 +struct razor_package_iterator *
3.8 +razor_package_iterator_create_for_property(struct razor_set *set,
3.9 + struct razor_property *property);
3.10
3.11 int razor_package_iterator_next(struct razor_package_iterator *pi,
3.12 struct razor_package **package,
3.13 @@ -42,12 +45,6 @@
3.14 void
3.15 razor_property_iterator_destroy(struct razor_property_iterator *pi);
3.16
3.17 -
3.18 -void razor_set_list_properties(struct razor_set *set, const char *name,
3.19 - enum razor_property_type type);
3.20 -void razor_set_list_property_packages(struct razor_set *set,
3.21 - struct razor_property *property);
3.22 -
3.23 void razor_set_list_files(struct razor_set *set, const char *prefix);
3.24 void razor_set_list_file_packages(struct razor_set *set, const char *filename);
3.25 void razor_set_list_package_files(struct razor_set *set, const char *name);