1.1 --- a/razor.c Thu Jan 03 09:32:31 2008 -0500
1.2 +++ b/razor.c Tue Jan 08 12:55:34 2008 -0500
1.3 @@ -323,7 +323,12 @@
1.4 static unsigned long
1.5 add_to_property_pool(struct array *pool, struct array *properties)
1.6 {
1.7 - unsigned long *p;
1.8 + unsigned long *p;
1.9 +
1.10 + if (properties->size == 0)
1.11 + return ~0;
1.12 + else if (properties->size == sizeof *p)
1.13 + return *(unsigned long *) properties->data | RAZOR_IMMEDIATE;
1.14
1.15 p = array_add(pool, properties->size);
1.16 memcpy(p, properties->data, properties->size);
1.17 @@ -756,9 +761,7 @@
1.18 s += p->count;
1.19
1.20 if (p->packages.size == 0) {
1.21 - /* FIXME: We need to make sure this is handled
1.22 - * correctly as the empty list. */
1.23 - e->packages = 0 | RAZOR_IMMEDIATE;
1.24 + e->packages = ~0;
1.25 } else if (p->packages.size / sizeof *r == 1) {
1.26 r = p->packages.data;
1.27 e->packages = *r | RAZOR_IMMEDIATE;
1.28 @@ -855,7 +858,7 @@
1.29 e = array_add(&importer->set->files, sizeof *e);
1.30 e->name = root.name | RAZOR_ENTRY_LAST;
1.31 e->start = 1;
1.32 - e->packages = 0;
1.33 + e->packages = ~0;
1.34
1.35 serialize_files(importer->set, &root, &importer->set->files);
1.36
1.37 @@ -874,10 +877,11 @@
1.38 count = set->packages.size / sizeof *p;
1.39 pkgs = zalloc(count * sizeof *pkgs);
1.40
1.41 - e = set->files.data;
1.42 end = set->files.data + set->files.size;
1.43 - while (e < end) {
1.44 - if (e->packages & RAZOR_IMMEDIATE) {
1.45 + for (e = set->files.data; e < end; e++) {
1.46 + if (e->packages == ~0) {
1.47 + continue;
1.48 + } else if (e->packages & RAZOR_IMMEDIATE) {
1.49 e->packages = rmap[e->packages & RAZOR_ENTRY_MASK] |
1.50 RAZOR_IMMEDIATE;
1.51 r = &e->packages;
1.52 @@ -891,7 +895,6 @@
1.53 if (*r++ & RAZOR_IMMEDIATE)
1.54 break;
1.55 }
1.56 - e++;
1.57 }
1.58
1.59 packages = set->packages.data;
1.60 @@ -939,23 +942,43 @@
1.61 return set;
1.62 }
1.63
1.64 -void
1.65 -razor_set_list(struct razor_set *set, const char *pattern)
1.66 +struct razor_package_iterator {
1.67 + struct razor_set *set;
1.68 + struct razor_package *package, *end;
1.69 +};
1.70 +
1.71 +struct razor_package_iterator *
1.72 +razor_package_iterator_create(struct razor_set *set)
1.73 {
1.74 - struct razor_package *p, *end;
1.75 - int with_version = 0;
1.76 + struct razor_package_iterator *pi;
1.77 +
1.78 + pi = zalloc(sizeof *pi);
1.79 + pi->set = set;
1.80 + pi->package = set->packages.data;
1.81 + pi->end = set->packages.data + set->packages.size;
1.82 +
1.83 + return pi;
1.84 +}
1.85 +
1.86 +int
1.87 +razor_package_iterator_next(struct razor_package_iterator *pi,
1.88 + struct razor_package **package,
1.89 + const char **name, const char **version)
1.90 +{
1.91 char *pool;
1.92
1.93 - pool = set->string_pool.data;
1.94 - end = set->packages.data + set->packages.size;
1.95 - for (p = set->packages.data; p < end; p++) {
1.96 - if (pattern && fnmatch(pattern, &pool[p->name], 0) != 0)
1.97 - continue;
1.98 - if (with_version)
1.99 - printf("%s-%s\n", &pool[p->name], &pool[p->version]);
1.100 - else
1.101 - printf("%s\n", &pool[p->name]);
1.102 - }
1.103 + pool = pi->set->string_pool.data;
1.104 + *package = pi->package;
1.105 + *name = &pool[pi->package->name];
1.106 + *version = &pool[pi->package->version];
1.107 +
1.108 + return pi->package++ < pi->end;
1.109 +}
1.110 +
1.111 +void
1.112 +razor_package_iterator_destroy(struct razor_package_iterator *pi)
1.113 +{
1.114 + free(pi);
1.115 }
1.116
1.117 struct razor_set *bsearch_set;
1.118 @@ -1010,51 +1033,71 @@
1.119 return p;
1.120 }
1.121
1.122 +struct razor_property_iterator {
1.123 + struct razor_set *set;
1.124 + struct razor_property *property, *end;
1.125 + unsigned long *index;
1.126 + int last;
1.127 +};
1.128 +
1.129 +struct razor_property_iterator *
1.130 +razor_property_iterator_create(struct razor_set *set,
1.131 + struct razor_package *package)
1.132 +{
1.133 + struct razor_property_iterator *pi;
1.134 +
1.135 + pi = zalloc(sizeof *pi);
1.136 + pi->set = set;
1.137 + pi->property = set->properties.data;
1.138 + pi->end = set->properties.data + set->properties.size;
1.139 + if (package) {
1.140 + pi->index = (unsigned long *)
1.141 + set->property_pool.data + package->properties;
1.142 + pi->last = 0;
1.143 + } else {
1.144 + pi->index = NULL;
1.145 + pi->last = 0;
1.146 + }
1.147 +
1.148 + return pi;
1.149 +}
1.150 +
1.151 +int
1.152 +razor_property_iterator_next(struct razor_property_iterator *pi,
1.153 + struct razor_property **property,
1.154 + const char **name, const char **version,
1.155 + enum razor_property_type *type)
1.156 +{
1.157 + char *pool;
1.158 + unsigned long flags, index;
1.159 + int valid;
1.160 + struct razor_property *p, *properties;
1.161 +
1.162 + if (pi->index) {
1.163 + properties = pi->set->properties.data;
1.164 + p = &properties[*pi->index & RAZOR_ENTRY_MASK];
1.165 + valid = !pi->last;
1.166 + pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0;
1.167 + if (!valid)
1.168 + return valid;
1.169 + } else {
1.170 + p = pi->property++;
1.171 + valid = p < pi->end;
1.172 + }
1.173 +
1.174 + pool = pi->set->string_pool.data;
1.175 + *property = p;
1.176 + *name = &pool[p->name & RAZOR_ENTRY_MASK];
1.177 + *version = &pool[p->version];
1.178 + *type = p->name >> 30;
1.179 +
1.180 + return valid;
1.181 +}
1.182 +
1.183 void
1.184 -razor_set_list_properties(struct razor_set *set, const char *name,
1.185 - enum razor_property_type type)
1.186 +razor_property_iterator_destroy(struct razor_property_iterator *pi)
1.187 {
1.188 - struct razor_property *p, *properties, *end;
1.189 - struct razor_package *package;
1.190 - unsigned long *r;
1.191 - char *pool;
1.192 -
1.193 - pool = set->string_pool.data;
1.194 -
1.195 - if (name) {
1.196 - package = razor_set_get_package(set, name);
1.197 - r = (unsigned long *) set->property_pool.data +
1.198 - package->properties;
1.199 - properties = set->properties.data;
1.200 - while (1) {
1.201 - p = &properties[*r & RAZOR_ENTRY_MASK];
1.202 - if ((p->name >> 30) != type)
1.203 - goto next;
1.204 - if (pool[p->version] == '\0')
1.205 - printf("%s\n",
1.206 - &pool[p->name & RAZOR_ENTRY_MASK]);
1.207 - else
1.208 - printf("%s-%s\n",
1.209 - &pool[p->name & RAZOR_ENTRY_MASK],
1.210 - &pool[p->version]);
1.211 - next:
1.212 - if (*r++ & RAZOR_IMMEDIATE)
1.213 - break;
1.214 - }
1.215 - } else {
1.216 - end = set->properties.data + set->properties.size;
1.217 - for (p = set->properties.data; p < end; p++) {
1.218 - if ((p->name >> 30) != type)
1.219 - continue;
1.220 - if (pool[p->version] == '\0')
1.221 - printf("%s\n",
1.222 - &pool[p->name & RAZOR_ENTRY_MASK]);
1.223 - else
1.224 - printf("%s-%s\n",
1.225 - &pool[p->name & RAZOR_ENTRY_MASK],
1.226 - &pool[p->version]);
1.227 - }
1.228 - }
1.229 + free(pi);
1.230 }
1.231
1.232 void