1.1 --- a/razor.c Mon Feb 11 11:21:54 2008 -0500
1.2 +++ b/razor.c Mon Feb 11 11:57:47 2008 -0500
1.3 @@ -33,9 +33,6 @@
1.4 #define RAZOR_MAGIC 0x7a7a7a7a
1.5 #define RAZOR_VERSION 1
1.6
1.7 -#define RAZOR_ENTRY_LAST 0x80000000ul
1.8 -#define RAZOR_ENTRY_MASK 0x00fffffful
1.9 -
1.10 #define RAZOR_STRING_POOL 0
1.11 #define RAZOR_PACKAGES 1
1.12 #define RAZOR_PROPERTIES 2
1.13 @@ -45,7 +42,8 @@
1.14 #define RAZOR_FILE_POOL 6
1.15
1.16 struct razor_package {
1.17 - uint32_t name;
1.18 + uint name : 24;
1.19 + uint flags : 8;
1.20 uint32_t version;
1.21 struct list_head properties;
1.22 struct list_head files;
1.23 @@ -61,11 +59,14 @@
1.24 };
1.25
1.26 struct razor_entry {
1.27 - uint32_t name;
1.28 + uint name : 24;
1.29 + uint flags : 8;
1.30 uint32_t start;
1.31 struct list_head packages;
1.32 };
1.33
1.34 +#define RAZOR_ENTRY_LAST 0x80
1.35 +
1.36 struct razor_set {
1.37 struct array string_pool;
1.38 struct array packages;
1.39 @@ -235,6 +236,7 @@
1.40
1.41 p = array_add(&importer->set->packages, sizeof *p);
1.42 p->name = hashtable_tokenize(&importer->table, name);
1.43 + p->flags = 0;
1.44 p->version = hashtable_tokenize(&importer->table, version);
1.45
1.46 importer->package = p;
1.47 @@ -447,6 +449,7 @@
1.48 struct razor_set *set = data;
1.49 char *pool = set->string_pool.data;
1.50
1.51 + /* FIXME: what if the flags are different? */
1.52 if (pkg1->name == pkg2->name)
1.53 return versioncmp(&pool[pkg1->version], &pool[pkg2->version]);
1.54 else
1.55 @@ -558,6 +561,7 @@
1.56 while (p < end) {
1.57 e = array_add(array, sizeof *e);
1.58 e->name = p->name;
1.59 + e->flags = 0;
1.60 e->start = p->count > 0 ? s : 0;
1.61 s += p->count;
1.62
1.63 @@ -566,7 +570,7 @@
1.64 p++;
1.65 }
1.66 if (e != NULL)
1.67 - e->name |= RAZOR_ENTRY_LAST;
1.68 + e->flags |= RAZOR_ENTRY_LAST;
1.69
1.70 p = d->files.data;
1.71 end = d->files.data + d->files.size;
1.72 @@ -647,7 +651,8 @@
1.73 array_init(&importer->set->files);
1.74
1.75 e = array_add(&importer->set->files, sizeof *e);
1.76 - e->name = root.name | RAZOR_ENTRY_LAST;
1.77 + e->name = root.name;
1.78 + e->flags = RAZOR_ENTRY_LAST;
1.79 e->start = 1;
1.80 list_set_empty(&e->packages);
1.81
1.82 @@ -789,7 +794,7 @@
1.83 if (valid) {
1.84 pool = pi->set->string_pool.data;
1.85 *package = p;
1.86 - *name = &pool[p->name & RAZOR_ENTRY_MASK];
1.87 + *name = &pool[p->name];
1.88 *version = &pool[p->version];
1.89 } else {
1.90 *package = NULL;
1.91 @@ -899,7 +904,7 @@
1.92
1.93 e = (struct razor_entry *) set->files.data + dir->start;
1.94 do {
1.95 - n = pool + (e->name & RAZOR_ENTRY_MASK);
1.96 + n = pool + e->name;
1.97 if (strcmp(pattern + 1, n) == 0)
1.98 return e;
1.99 len = strlen(n);
1.100 @@ -907,7 +912,7 @@
1.101 pattern[len + 1] == '/') {
1.102 return find_entry(set, e, pattern + len + 1);
1.103 }
1.104 - } while (((e++)->name & RAZOR_ENTRY_LAST) == 0);
1.105 + } while (!((e++)->flags & RAZOR_ENTRY_LAST));
1.106
1.107 return NULL;
1.108 }
1.109 @@ -921,11 +926,11 @@
1.110
1.111 e = (struct razor_entry *) set->files.data + dir->start;
1.112 do {
1.113 - n = pool + (e->name & RAZOR_ENTRY_MASK);
1.114 + n = pool + e->name;
1.115 if (pattern && pattern[0] && fnmatch(pattern, n, 0) != 0)
1.116 continue;
1.117 printf("%s/%s%s\n", prefix, n, e->start > 0 ? "/" : "");
1.118 - } while (((e++)->name & RAZOR_ENTRY_LAST) == 0);
1.119 + } while (!((e++)->flags & RAZOR_ENTRY_LAST));
1.120 }
1.121
1.122 void
1.123 @@ -986,26 +991,25 @@
1.124 e = entries + dir->start;
1.125 do {
1.126 if (entries + r->data == e) {
1.127 - printf("%s/%s\n", prefix,
1.128 - pool + (e->name & RAZOR_ENTRY_MASK));
1.129 + printf("%s/%s\n", prefix, pool + e->name);
1.130 r = list_next(r);
1.131 if (!r)
1.132 return NULL;
1.133 if (r->data >= end)
1.134 return r;
1.135 }
1.136 - } while (!((e++)->name & RAZOR_ENTRY_LAST));
1.137 + } while (!((e++)->flags & RAZOR_ENTRY_LAST));
1.138
1.139 e = entries + dir->start;
1.140 do {
1.141 if (e->start == 0)
1.142 continue;
1.143
1.144 - if (e->name & RAZOR_ENTRY_LAST)
1.145 + if (e->flags & RAZOR_ENTRY_LAST)
1.146 next = end;
1.147 else {
1.148 f = e + 1;
1.149 - while (f->start == 0 && !(f->name & RAZOR_ENTRY_LAST))
1.150 + while (f->start == 0 && !(f->flags & RAZOR_ENTRY_LAST))
1.151 f++;
1.152 if (f->start == 0)
1.153 next = end;
1.154 @@ -1017,12 +1021,11 @@
1.155 if (e->start <= file && file < next) {
1.156 len = strlen(prefix);
1.157 prefix[len] = '/';
1.158 - strcpy(prefix + len + 1,
1.159 - pool + (e->name & RAZOR_ENTRY_MASK));
1.160 + strcpy(prefix + len + 1, pool + e->name);
1.161 r = list_package_files(set, r, e, next, prefix);
1.162 prefix[len] = '\0';
1.163 }
1.164 - } while (!((e++)->name & RAZOR_ENTRY_LAST) && r != NULL);
1.165 + } while (!((e++)->flags & RAZOR_ENTRY_LAST) && r != NULL);
1.166
1.167 return r;
1.168 }
1.169 @@ -1121,8 +1124,7 @@
1.170 array_release(&unsatisfied);
1.171 }
1.172
1.173 -#define UPSTREAM_SOURCE 0x80000000ul
1.174 -#define INDEX_MASK 0x00fffffful
1.175 +#define UPSTREAM_SOURCE 0x80
1.176
1.177 struct source {
1.178 struct razor_set *set;
1.179 @@ -1172,7 +1174,7 @@
1.180 pool = source->set->string_pool.data;
1.181 p = array_add(&merger->set->packages, sizeof *p);
1.182 p->name = hashtable_tokenize(&merger->table, &pool[package->name]);
1.183 - p->name |= flags;
1.184 + p->flags = flags;
1.185 p->version = hashtable_tokenize(&merger->table,
1.186 &pool[package->version]);
1.187 p->properties = package->properties;
1.188 @@ -1416,7 +1418,7 @@
1.189 for (p = merger->set->packages.data; p < pend; p++) {
1.190 struct source *src;
1.191
1.192 - if (p->name & UPSTREAM_SOURCE)
1.193 + if (p->flags & UPSTREAM_SOURCE)
1.194 src = &merger->source2;
1.195 else
1.196 src = &merger->source1;
1.197 @@ -1425,7 +1427,7 @@
1.198 &src->set->property_pool,
1.199 src->property_map,
1.200 &merger->set->property_pool);
1.201 - p->name &= INDEX_MASK;
1.202 + p->flags &= ~UPSTREAM_SOURCE;
1.203 }
1.204
1.205 rebuild_package_lists(merger->set);