1.1 --- a/razor.c Wed Sep 05 00:32:09 2007 -0400
1.2 +++ b/razor.c Thu Sep 06 15:11:49 2007 -0400
1.3 @@ -92,17 +92,19 @@
1.4
1.5 #define RAZOR_MAGIC 0x7a7a7a7a
1.6 #define RAZOR_VERSION 1
1.7 +
1.8 #define RAZOR_BUCKETS 1
1.9 #define RAZOR_STRINGS 2
1.10 #define RAZOR_PACKAGES 3
1.11 -#define RAZOR_PROVIDES 4
1.12 +#define RAZOR_REQUIRES 4
1.13 +#define RAZOR_PROVIDES 5
1.14
1.15 struct razor_package {
1.16 unsigned long name;
1.17 unsigned long version;
1.18 };
1.19
1.20 -struct razor_provides {
1.21 +struct razor_property {
1.22 unsigned long name;
1.23 unsigned long version;
1.24 };
1.25 @@ -111,6 +113,7 @@
1.26 struct array buckets;
1.27 struct array string_pool;
1.28 struct array packages;
1.29 + struct array requires;
1.30 struct array provides;
1.31 struct razor_set_header *header;
1.32 };
1.33 @@ -166,6 +169,11 @@
1.34 set->packages.size = size;
1.35 set->packages.size = size;
1.36 break;
1.37 + case RAZOR_REQUIRES:
1.38 + set->requires.data = (void *) set->header + offset;
1.39 + set->requires.size = size;
1.40 + set->requires.size = size;
1.41 + break;
1.42 case RAZOR_PROVIDES:
1.43 set->provides.data = (void *) set->header + offset;
1.44 set->provides.size = size;
1.45 @@ -203,11 +211,12 @@
1.46 {
1.47 char data[4096];
1.48 struct razor_set_header *header = (struct razor_set_header *) data;
1.49 - int fd, pool_size, packages_size, provides_size;
1.50 + int fd, pool_size, packages_size, requires_size, provides_size;
1.51
1.52 /* Align these to pages sizes */
1.53 pool_size = (set->string_pool.size + 4095) & ~4095;
1.54 packages_size = (set->packages.size + 4095) & ~4095;
1.55 + requires_size = (set->requires.size + 4095) & ~4095;
1.56 provides_size = (set->provides.size + 4095) & ~4095;
1.57
1.58 memset(data, 0, sizeof data);
1.59 @@ -225,13 +234,17 @@
1.60 header->sections[2].offset =
1.61 header->sections[1].offset + pool_size;
1.62
1.63 - header->sections[3].type = RAZOR_PROVIDES;
1.64 + header->sections[3].type = RAZOR_REQUIRES;
1.65 header->sections[3].offset =
1.66 header->sections[2].offset + packages_size;
1.67
1.68 - header->sections[4].type = 0;
1.69 + header->sections[4].type = RAZOR_PROVIDES;
1.70 header->sections[4].offset =
1.71 - header->sections[3].offset + provides_size;
1.72 + header->sections[3].offset + requires_size;
1.73 +
1.74 + header->sections[5].type = 0;
1.75 + header->sections[5].offset =
1.76 + header->sections[4].offset + provides_size;
1.77
1.78 fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
1.79 if (fd < 0)
1.80 @@ -241,6 +254,7 @@
1.81 write_to_fd(fd, set->buckets.data, set->buckets.alloc);
1.82 write_to_fd(fd, set->string_pool.data, pool_size);
1.83 write_to_fd(fd, set->packages.data, packages_size);
1.84 + write_to_fd(fd, set->requires.data, requires_size);
1.85 write_to_fd(fd, set->provides.data, provides_size);
1.86
1.87 return 0;
1.88 @@ -356,17 +370,31 @@
1.89 }
1.90
1.91 static unsigned long
1.92 +razor_set_add_requires(struct razor_set *set,
1.93 + unsigned long name, unsigned long version)
1.94 +{
1.95 + struct razor_property *p;
1.96 +
1.97 + p = array_add(&set->requires, sizeof *p);
1.98 +
1.99 + p->name = name;
1.100 + p->version = version;
1.101 +
1.102 + return p - (struct razor_property *) set->requires.data;
1.103 +}
1.104 +
1.105 +static unsigned long
1.106 razor_set_add_provides(struct razor_set *set,
1.107 unsigned long name, unsigned long version)
1.108 {
1.109 - struct razor_provides *p;
1.110 + struct razor_property *p;
1.111
1.112 p = array_add(&set->provides, sizeof *p);
1.113
1.114 p->name = name;
1.115 p->version = version;
1.116
1.117 - return p - (struct razor_provides *) set->packages.data;
1.118 + return p - (struct razor_property *) set->provides.data;
1.119 }
1.120
1.121 unsigned long
1.122 @@ -393,12 +421,12 @@
1.123 }
1.124
1.125 static int
1.126 -compare_provides(const void *p1, const void *p2)
1.127 +compare_properties(const void *p1, const void *p2)
1.128 {
1.129 - const struct razor_provides *prv1 = p1, *prv2 = p2;
1.130 + const struct razor_property *prop1 = p1, *prop2 = p2;
1.131 char *pool = qsort_set->string_pool.data;
1.132
1.133 - return strcmp(&pool[prv1->name], &pool[prv2->name]);
1.134 + return strcmp(&pool[prop1->name], &pool[prop2->name]);
1.135 }
1.136
1.137 static void
1.138 @@ -408,9 +436,12 @@
1.139 qsort(set->packages.data,
1.140 set->packages.size / sizeof(struct razor_package),
1.141 sizeof(struct razor_package), compare_packages);
1.142 + qsort(set->requires.data,
1.143 + set->requires.size / sizeof(struct razor_property),
1.144 + sizeof(struct razor_property), compare_properties);
1.145 qsort(set->provides.data,
1.146 - set->provides.size / sizeof(struct razor_provides),
1.147 - sizeof(struct razor_provides), compare_provides);
1.148 + set->provides.size / sizeof(struct razor_property),
1.149 + sizeof(struct razor_property), compare_properties);
1.150 }
1.151
1.152 struct parsing_context {
1.153 @@ -443,6 +474,26 @@
1.154 }
1.155
1.156 static void
1.157 +parse_requires(struct parsing_context *ctx, const char **atts)
1.158 +{
1.159 + unsigned long name = 0, version = 0;
1.160 + int i;
1.161 +
1.162 + for (i = 0; atts[i]; i += 2) {
1.163 + if (strcmp(atts[i], "name") == 0)
1.164 + name = razor_set_tokenize(ctx->set, atts[i + 1]);
1.165 + }
1.166 +
1.167 + if (name == 0) {
1.168 + fprintf(stderr, "invalid requires tag, "
1.169 + "missing name attribute\n");
1.170 + return;
1.171 + }
1.172 +
1.173 + ctx->pkg_id = razor_set_add_requires(ctx->set, name, version);
1.174 +}
1.175 +
1.176 +static void
1.177 parse_provides(struct parsing_context *ctx, const char **atts)
1.178 {
1.179 unsigned long name = 0, version = 0;
1.180 @@ -470,6 +521,8 @@
1.181
1.182 if (strcmp(name, "package") == 0)
1.183 parse_package(ctx, atts);
1.184 + else if (strcmp(name, "requires") == 0)
1.185 + parse_requires(ctx, atts);
1.186 else if (strcmp(name, "provides") == 0)
1.187 parse_provides(ctx, atts);
1.188
1.189 @@ -566,9 +619,21 @@
1.190 }
1.191
1.192 void
1.193 +razor_set_list_requires(struct razor_set *set)
1.194 +{
1.195 + struct razor_property *p, *end;
1.196 + char *pool;
1.197 +
1.198 + pool = set->string_pool.data;
1.199 + end = set->requires.data + set->requires.size;
1.200 + for (p = set->requires.data; p < end && p->name; p++)
1.201 + printf("%s %s\n", &pool[p->name], &pool[p->version]);
1.202 +}
1.203 +
1.204 +void
1.205 razor_set_list_provides(struct razor_set *set)
1.206 {
1.207 - struct razor_provides *p, *end;
1.208 + struct razor_property *p, *end;
1.209 char *pool;
1.210
1.211 pool = set->string_pool.data;
1.212 @@ -597,6 +662,9 @@
1.213 case RAZOR_PACKAGES:
1.214 printf("package section:\t%dkb\n", size / 1024);
1.215 break;
1.216 + case RAZOR_REQUIRES:
1.217 + printf("requires section:\t%dkb\n", size / 1024);
1.218 + break;
1.219 case RAZOR_PROVIDES:
1.220 printf("provides section:\t%dkb\n", size / 1024);
1.221 break;
1.222 @@ -608,7 +676,7 @@
1.223 usage(void)
1.224 {
1.225 printf("usage: razor [ import FILES | lookup <key> | "
1.226 - "list | list-provides | info ]\n");
1.227 + "list | list-requires | list-provides | info ]\n");
1.228 exit(1);
1.229 }
1.230
1.231 @@ -645,6 +713,7 @@
1.232 * should probably just have a size field in the
1.233 * header section. */
1.234 razor_set_add_package(set, 0, 0);
1.235 + razor_set_add_requires(set, 0, 0);
1.236 razor_set_add_provides(set, 0, 0);
1.237
1.238 printf("bucket allocation: %d\n", set->buckets.alloc);
1.239 @@ -652,8 +721,10 @@
1.240 printf("pool allocation: %d\n", set->string_pool.alloc);
1.241 printf("packages: %d\n",
1.242 set->packages.size / sizeof(struct razor_package));
1.243 + printf("requires: %d\n",
1.244 + set->requires.size / sizeof(struct razor_property));
1.245 printf("provides: %d\n",
1.246 - set->provides.size / sizeof(struct razor_provides));
1.247 + set->provides.size / sizeof(struct razor_property));
1.248
1.249 razor_set_write(set, repo_filename);
1.250
1.251 @@ -667,6 +738,10 @@
1.252 set = razor_set_open(repo_filename);
1.253 razor_set_list(set);
1.254 razor_set_destroy(set);
1.255 + } else if (strcmp(argv[1], "list-requires") == 0) {
1.256 + set = razor_set_open(repo_filename);
1.257 + razor_set_list_requires(set);
1.258 + razor_set_destroy(set);
1.259 } else if (strcmp(argv[1], "list-provides") == 0) {
1.260 set = razor_set_open(repo_filename);
1.261 razor_set_list_provides(set);