1.1 --- a/razor.c Thu Jan 10 23:42:42 2008 -0500
1.2 +++ b/razor.c Thu Jan 17 23:28:37 2008 -0500
1.3 @@ -938,34 +938,75 @@
1.4 struct razor_package_iterator {
1.5 struct razor_set *set;
1.6 struct razor_package *package, *end;
1.7 + unsigned long *index;
1.8 + int last;
1.9 };
1.10
1.11 struct razor_package_iterator *
1.12 -razor_package_iterator_create(struct razor_set *set)
1.13 +razor_package_iterator_create_with_index(struct razor_set *set,
1.14 + unsigned long *index)
1.15 {
1.16 struct razor_package_iterator *pi;
1.17
1.18 pi = zalloc(sizeof *pi);
1.19 pi->set = set;
1.20 + pi->end = set->packages.data + set->packages.size;
1.21 pi->package = set->packages.data;
1.22 - pi->end = set->packages.data + set->packages.size;
1.23 + pi->index = index;
1.24
1.25 return pi;
1.26 }
1.27
1.28 +struct razor_package_iterator *
1.29 +razor_package_iterator_create(struct razor_set *set)
1.30 +{
1.31 + return razor_package_iterator_create_with_index(set, NULL);
1.32 +}
1.33 +
1.34 +struct razor_package_iterator *
1.35 +razor_package_iterator_create_for_property(struct razor_set *set,
1.36 + struct razor_property *property)
1.37 +{
1.38 + unsigned long *index;
1.39 +
1.40 + if (property->packages & RAZOR_IMMEDIATE)
1.41 + index = &property->packages;
1.42 + else
1.43 + index = (unsigned long *)
1.44 + set->package_pool.data + property->packages;
1.45 +
1.46 + return razor_package_iterator_create_with_index(set, index);
1.47 +}
1.48 +
1.49 int
1.50 razor_package_iterator_next(struct razor_package_iterator *pi,
1.51 struct razor_package **package,
1.52 const char **name, const char **version)
1.53 {
1.54 char *pool;
1.55 + int valid;
1.56 + struct razor_package *p, *packages;
1.57
1.58 - pool = pi->set->string_pool.data;
1.59 - *package = pi->package;
1.60 - *name = &pool[pi->package->name];
1.61 - *version = &pool[pi->package->version];
1.62 + if (pi->index) {
1.63 + packages = pi->set->packages.data;
1.64 + p = &packages[*pi->index & RAZOR_ENTRY_MASK];
1.65 + valid = !pi->last;
1.66 + pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0;
1.67 + } else {
1.68 + p = pi->package++;
1.69 + valid = p < pi->end;
1.70 + }
1.71
1.72 - return pi->package++ < pi->end;
1.73 + if (valid) {
1.74 + pool = pi->set->string_pool.data;
1.75 + *package = p;
1.76 + *name = &pool[p->name & RAZOR_ENTRY_MASK];
1.77 + *version = &pool[p->version];
1.78 + } else {
1.79 + *package = NULL;
1.80 + }
1.81 +
1.82 + return valid;
1.83 }
1.84
1.85 void
1.86 @@ -1007,12 +1048,11 @@
1.87 pi = zalloc(sizeof *pi);
1.88 pi->set = set;
1.89 pi->end = set->properties.data + set->properties.size;
1.90 + pi->property = set->properties.data;
1.91
1.92 if (package)
1.93 pi->index = (unsigned long *)
1.94 set->property_pool.data + package->properties;
1.95 - else
1.96 - pi->property = set->properties.data;
1.97
1.98 return pi;
1.99 }
1.100 @@ -1056,32 +1096,6 @@
1.101 free(pi);
1.102 }
1.103
1.104 -void
1.105 -razor_set_list_property_packages(struct razor_set *set,
1.106 - struct razor_property *property)
1.107 -{
1.108 - struct razor_package *p, *packages;
1.109 - const char *pool;
1.110 - unsigned long *r;
1.111 -
1.112 - packages = set->packages.data;
1.113 - pool = set->string_pool.data;
1.114 -
1.115 - if (property->packages & RAZOR_IMMEDIATE)
1.116 - r = &property->packages;
1.117 - else
1.118 - r = (unsigned long *)
1.119 - set->package_pool.data + property->packages;
1.120 - while (1) {
1.121 - p = &packages[*r & RAZOR_ENTRY_MASK];
1.122 - printf("%s-%s\n",
1.123 - &pool[p->name & RAZOR_ENTRY_MASK],
1.124 - &pool[p->version]);
1.125 - if (*r++ & RAZOR_IMMEDIATE)
1.126 - break;
1.127 - }
1.128 -}
1.129 -
1.130 static struct razor_entry *
1.131 find_entry(struct razor_set *set, struct razor_entry *dir, const char *pattern)
1.132 {