1.1 --- a/razor.c Tue Sep 11 19:25:32 2007 -0400
1.2 +++ b/razor.c Wed Sep 12 05:31:07 2007 -0400
1.3 @@ -1,6 +1,7 @@
1.4 #define _GNU_SOURCE
1.5
1.6 #include <stdlib.h>
1.7 +#include <stddef.h>
1.8 #include <stdio.h>
1.9 #include <string.h>
1.10 #include <sys/types.h>
1.11 @@ -13,6 +14,8 @@
1.12 #include <expat.h>
1.13 #include "sha1.h"
1.14
1.15 +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
1.16 +
1.17 struct array {
1.18 void *data;
1.19 int size, alloc;
1.20 @@ -99,21 +102,26 @@
1.21 return p;
1.22 }
1.23
1.24 +struct razor_set_section {
1.25 + unsigned int type;
1.26 + unsigned int offset;
1.27 + unsigned int size;
1.28 +};
1.29 +
1.30 struct razor_set_header {
1.31 unsigned int magic;
1.32 unsigned int version;
1.33 - struct { unsigned int type, offset, size; } sections[0];
1.34 + struct razor_set_section sections[0];
1.35 };
1.36
1.37 #define RAZOR_MAGIC 0x7a7a7a7a
1.38 #define RAZOR_VERSION 1
1.39
1.40 -#define RAZOR_BUCKETS 1
1.41 -#define RAZOR_STRINGS 2
1.42 -#define RAZOR_PACKAGES 3
1.43 -#define RAZOR_REQUIRES 4
1.44 -#define RAZOR_PROVIDES 5
1.45 -#define RAZOR_PROPERTIES 6
1.46 +#define RAZOR_PACKAGES 0
1.47 +#define RAZOR_REQUIRES 1
1.48 +#define RAZOR_PROVIDES 2
1.49 +#define RAZOR_STRING_POOL 3
1.50 +#define RAZOR_PROPERTY_POOL 4
1.51
1.52 struct razor_package {
1.53 unsigned long name;
1.54 @@ -138,6 +146,14 @@
1.55 struct razor_set_header *header;
1.56 };
1.57
1.58 +struct razor_set_section razor_sections[] = {
1.59 + { RAZOR_PACKAGES, offsetof(struct razor_set, packages) },
1.60 + { RAZOR_REQUIRES, offsetof(struct razor_set, requires) },
1.61 + { RAZOR_PROVIDES, offsetof(struct razor_set, provides) },
1.62 + { RAZOR_STRING_POOL, offsetof(struct razor_set, string_pool) },
1.63 + { RAZOR_PROPERTY_POOL, offsetof(struct razor_set, property_pool) },
1.64 +};
1.65 +
1.66 struct razor_set *
1.67 razor_set_create(void)
1.68 {
1.69 @@ -148,9 +164,10 @@
1.70 razor_set_open(const char *filename)
1.71 {
1.72 struct razor_set *set;
1.73 + struct razor_set_section *s;
1.74 struct stat stat;
1.75 - unsigned int size, offset;
1.76 - int fd, i;
1.77 + struct array *array;
1.78 + int fd;
1.79
1.80 set = zalloc(sizeof *set);
1.81 fd = open(filename, O_RDONLY);
1.82 @@ -162,37 +179,15 @@
1.83 return NULL;
1.84 }
1.85
1.86 - for (i = 0; i < set->header->sections[i].type; i++) {
1.87 - offset = set->header->sections[i].offset;
1.88 - size = set->header->sections[i].size;
1.89 -
1.90 - switch (set->header->sections[i].type) {
1.91 - case RAZOR_STRINGS:
1.92 - set->string_pool.data = (void *) set->header + offset;
1.93 - set->string_pool.size = size;
1.94 - set->string_pool.alloc = size;
1.95 - break;
1.96 - case RAZOR_PACKAGES:
1.97 - set->packages.data = (void *) set->header + offset;
1.98 - set->packages.size = size;
1.99 - set->packages.size = size;
1.100 - break;
1.101 - case RAZOR_REQUIRES:
1.102 - set->requires.data = (void *) set->header + offset;
1.103 - set->requires.size = size;
1.104 - set->requires.size = size;
1.105 - break;
1.106 - case RAZOR_PROVIDES:
1.107 - set->provides.data = (void *) set->header + offset;
1.108 - set->provides.size = size;
1.109 - set->provides.size = size;
1.110 - break;
1.111 - case RAZOR_PROPERTIES:
1.112 - set->property_pool.data = (void *) set->header + offset;
1.113 - set->property_pool.size = size;
1.114 - set->property_pool.size = size;
1.115 - break;
1.116 - }
1.117 + for (s = set->header->sections; ~s->type; s++) {
1.118 + if (s->type >= ARRAY_SIZE(razor_sections))
1.119 + continue;
1.120 + if (s->type != razor_sections[s->type].type)
1.121 + continue;
1.122 + array = (void *) set + razor_sections[s->type].offset;
1.123 + array->data = (void *) set->header + s->offset;
1.124 + array->size = s->size;
1.125 + array->alloc = s->size;
1.126 }
1.127 close(fd);
1.128
1.129 @@ -203,6 +198,7 @@
1.130 razor_set_destroy(struct razor_set *set)
1.131 {
1.132 unsigned int size;
1.133 + struct array *a;
1.134 int i;
1.135
1.136 if (set->header) {
1.137 @@ -212,12 +208,11 @@
1.138 munmap(set->header, size);
1.139 free(set->buckets.data);
1.140 } else {
1.141 + for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
1.142 + a = (void *) set + razor_sections[i].offset;
1.143 + free(a->data);
1.144 + }
1.145 free(set->buckets.data);
1.146 - free(set->string_pool.data);
1.147 - free(set->packages.data);
1.148 - free(set->requires.data);
1.149 - free(set->provides.data);
1.150 - free(set->property_pool.data);
1.151 }
1.152
1.153 free(set);
1.154 @@ -228,30 +223,26 @@
1.155 {
1.156 char data[4096];
1.157 struct razor_set_header *header = (struct razor_set_header *) data;
1.158 + struct array *a;
1.159 unsigned long offset;
1.160 int i, fd;
1.161 - struct { int type; struct array *array; } sections[] = {
1.162 - { RAZOR_STRINGS, &set->string_pool },
1.163 - { RAZOR_PACKAGES, &set->packages },
1.164 - { RAZOR_REQUIRES, &set->requires },
1.165 - { RAZOR_PROVIDES, &set->provides },
1.166 - { RAZOR_PROPERTIES, &set->property_pool },
1.167 - { 0 }
1.168 - };
1.169
1.170 memset(data, 0, sizeof data);
1.171 header->magic = RAZOR_MAGIC;
1.172 header->version = RAZOR_VERSION;
1.173 offset = sizeof data;
1.174
1.175 - for (i = 0; sections[i].type != 0; i++) {
1.176 - header->sections[i].type = sections[i].type;
1.177 + for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
1.178 + if (razor_sections[i].type != i)
1.179 + continue;
1.180 + a = (void *) set + razor_sections[i].offset;
1.181 + header->sections[i].type = i;
1.182 header->sections[i].offset = offset;
1.183 - header->sections[i].size = sections[i].array->size;
1.184 - offset += (sections[i].array->size + 4095) & ~4095;
1.185 + header->sections[i].size = a->size;
1.186 + offset += (a->size + 4095) & ~4095;
1.187 }
1.188
1.189 - header->sections[i].type = 0;
1.190 + header->sections[i].type = ~0;
1.191 header->sections[i].offset = 0;
1.192 header->sections[i].size = 0;
1.193
1.194 @@ -260,9 +251,12 @@
1.195 return -1;
1.196
1.197 write_to_fd(fd, data, sizeof data);
1.198 - for (i = 0; sections[i].type != 0; i++)
1.199 - write_to_fd(fd, sections[i].array->data,
1.200 - (sections[i].array->size + 4095) & ~4095);
1.201 + for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
1.202 + if (razor_sections[i].type != i)
1.203 + continue;
1.204 + a = (void *) set + razor_sections[i].offset;
1.205 + write_to_fd(fd, a->data, (a->size + 4095) & ~4095);
1.206 + }
1.207
1.208 close(fd);
1.209
1.210 @@ -1060,9 +1054,6 @@
1.211 size = set->header->sections[i].size;
1.212
1.213 switch (set->header->sections[i].type) {
1.214 - case RAZOR_STRINGS:
1.215 - printf("string pool:\t\t%dkb\n", size / 1024);
1.216 - break;
1.217 case RAZOR_PACKAGES:
1.218 printf("package section:\t%dkb\n", size / 1024);
1.219 break;
1.220 @@ -1072,7 +1063,10 @@
1.221 case RAZOR_PROVIDES:
1.222 printf("provides section:\t%dkb\n", size / 1024);
1.223 break;
1.224 - case RAZOR_PROPERTIES:
1.225 + case RAZOR_STRING_POOL:
1.226 + printf("string pool:\t\t%dkb\n", size / 1024);
1.227 + break;
1.228 + case RAZOR_PROPERTY_POOL:
1.229 printf("properties section:\t%dkb\n", size / 1024);
1.230 break;
1.231 }