razor.c
changeset 19 d2a716dd92bd
parent 18 b2bf852ca8d1
child 20 0aa6cf605ea0
     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  		}