1.1 --- a/razor.c Sun Oct 21 22:41:14 2007 -0400
1.2 +++ b/razor.c Mon Oct 22 22:53:55 2007 -0400
1.3 @@ -60,6 +60,7 @@
1.4 unsigned long name;
1.5 unsigned long count;
1.6 unsigned long start;
1.7 + unsigned long packages;
1.8 };
1.9
1.10 struct razor_set {
1.11 @@ -74,6 +75,18 @@
1.12 struct razor_set_header *header;
1.13 };
1.14
1.15 +struct import_entry {
1.16 + unsigned long package;
1.17 + char *name;
1.18 +};
1.19 +
1.20 +struct import_directory {
1.21 + unsigned long name, count;
1.22 + struct array files;
1.23 + struct array packages;
1.24 + struct import_directory *last;
1.25 +};
1.26 +
1.27 struct import_property_context {
1.28 struct array *all;
1.29 struct array package;
1.30 @@ -463,10 +476,13 @@
1.31 void
1.32 razor_importer_add_file(struct razor_importer *importer, const char *name)
1.33 {
1.34 - char **p;
1.35 + struct import_entry *e;
1.36
1.37 - p = array_add(&importer->files, sizeof *p);
1.38 - *p = strdup(name);
1.39 + e = array_add(&importer->files, sizeof *e);
1.40 +
1.41 + e->package = importer->package -
1.42 + (struct razor_package *) importer->set->packages.data;
1.43 + e->name = strdup(name);
1.44 }
1.45
1.46 struct razor_importer *
1.47 @@ -699,22 +715,16 @@
1.48 static int
1.49 compare_filenames(const void *p1, const void *p2, void *data)
1.50 {
1.51 - char *f1 = *(char **) p1;
1.52 - char *f2 = *(char **) p2;
1.53 + const struct import_entry *e1 = p1;
1.54 + const struct import_entry *e2 = p2;
1.55
1.56 - return strcmp(f1, f2);
1.57 + return strcmp(e1->name, e2->name);
1.58 }
1.59
1.60 -struct directory {
1.61 - unsigned long name, count;
1.62 - struct array files;
1.63 - struct directory *last;
1.64 -};
1.65 -
1.66 static void
1.67 -count_entries(struct directory *d)
1.68 +count_entries(struct import_directory *d)
1.69 {
1.70 - struct directory *p, *end;
1.71 + struct import_directory *p, *end;
1.72
1.73 p = d->files.data;
1.74 end = d->files.data + d->files.size;
1.75 @@ -727,9 +737,10 @@
1.76 }
1.77
1.78 static void
1.79 -serialize_files(struct directory *d, struct array *array)
1.80 +serialize_files(struct razor_set *set,
1.81 + struct import_directory *d, struct array *array)
1.82 {
1.83 - struct directory *p, *end;
1.84 + struct import_directory *p, *end;
1.85 struct razor_entry *e;
1.86 unsigned long s;
1.87
1.88 @@ -742,13 +753,16 @@
1.89 e->count = p->files.size / sizeof *p;
1.90 e->start = s;
1.91 s += p->count;
1.92 + e->packages = add_to_property_pool(&set->package_pool,
1.93 + &p->packages);
1.94 + array_release(&p->packages);
1.95 p++;
1.96 }
1.97
1.98 p = d->files.data;
1.99 end = d->files.data + d->files.size;
1.100 while (p < end) {
1.101 - serialize_files(p, array);
1.102 + serialize_files(set, p, array);
1.103 p++;
1.104 }
1.105 }
1.106 @@ -757,26 +771,28 @@
1.107 build_file_tree(struct razor_importer *importer)
1.108 {
1.109 int count, i, length;
1.110 - char **filenames, *f, *end;
1.111 - unsigned long name;
1.112 + struct import_entry *filenames;
1.113 + char *f, *end;
1.114 + unsigned long name, *r;
1.115 char dirname[256];
1.116 - struct directory *d, root;
1.117 + struct import_directory *d, root;
1.118 struct razor_entry *e;
1.119
1.120 - count = importer->files.size / sizeof (char *);
1.121 + count = importer->files.size / sizeof (struct import_entry);
1.122 qsort_with_data(importer->files.data,
1.123 count,
1.124 - sizeof (char *),
1.125 + sizeof (struct import_entry),
1.126 compare_filenames,
1.127 NULL);
1.128
1.129 root.name = razor_importer_tokenize(importer, "");
1.130 array_init(&root.files);
1.131 + array_init(&root.packages);
1.132 root.last = NULL;
1.133
1.134 filenames = importer->files.data;
1.135 for (i = 0; i < count; i++) {
1.136 - f = filenames[i];
1.137 + f = filenames[i].name;
1.138 if (*f != '/')
1.139 continue;
1.140
1.141 @@ -794,12 +810,15 @@
1.142 d->last->name = name;
1.143 d->last->last = NULL;
1.144 array_init(&d->last->files);
1.145 + array_init(&d->last->packages);
1.146 }
1.147 d = d->last;
1.148 f = end;
1.149 }
1.150
1.151 - free(filenames[i]);
1.152 + r = array_add(&d->packages, sizeof *r);
1.153 + *r = filenames[i].package;
1.154 + free(filenames[i].name);
1.155 }
1.156
1.157 count_entries(&root);
1.158 @@ -810,7 +829,7 @@
1.159 e->count = root.files.size / sizeof *d;
1.160 e->start = 1;
1.161
1.162 - serialize_files(&root, &importer->set->file_tree);
1.163 + serialize_files(importer->set, &root, &importer->set->file_tree);
1.164
1.165 array_release(&importer->files);
1.166 }
1.167 @@ -867,6 +886,27 @@
1.168 list_dir(set, e, 2);
1.169 }
1.170
1.171 +void
1.172 +razor_set_list_file_packages(struct razor_set *set, const char *filename)
1.173 +{
1.174 + struct razor_entry *e;
1.175 + struct razor_package *packages, *p;
1.176 + const char *pool;
1.177 + unsigned long *r;
1.178 +
1.179 + e = find_entry(set, set->file_tree.data, filename);
1.180 + if (e == NULL)
1.181 + return;
1.182 +
1.183 + r = (unsigned long *) set->package_pool.data + e->packages;
1.184 + packages = set->packages.data;
1.185 + pool = set->string_pool.data;
1.186 + while (~*r) {
1.187 + p = &packages[*r++];
1.188 + printf("%s %s\n", &pool[p->name], &pool[p->version]);
1.189 + }
1.190 +}
1.191 +
1.192 struct razor_set *
1.193 razor_importer_finish(struct razor_importer *importer)
1.194 {
1.195 @@ -892,12 +932,11 @@
1.196 rmap = malloc(count * sizeof *rmap);
1.197 for (i = 0; i < count; i++)
1.198 rmap[map[i]] = i;
1.199 -
1.200 - remap_links(&importer->set->package_pool, rmap);
1.201 free(map);
1.202 - free(rmap);
1.203
1.204 build_file_tree(importer);
1.205 + remap_links(&importer->set->package_pool, rmap);
1.206 + free(rmap);
1.207
1.208 set = importer->set;
1.209 array_release(&importer->buckets);