Add a size field to the section headers to avoid sentinels.
authorKristian H?gsberg <krh@redhat.com>
Fri Sep 07 12:11:37 2007 -0400 (2007-09-07)
changeset 14d21d74d6e297
parent 13 6a715b310792
child 15 228bd47c5dc4
Add a size field to the section headers to avoid sentinels.
razor.c
     1.1 --- a/razor.c	Fri Sep 07 11:56:04 2007 -0400
     1.2 +++ b/razor.c	Fri Sep 07 12:11:37 2007 -0400
     1.3 @@ -99,7 +99,7 @@
     1.4  struct razor_set_header {
     1.5  	unsigned int magic;
     1.6  	unsigned int version;
     1.7 -	struct { unsigned int type, offset; } sections[0];
     1.8 +	struct { unsigned int type, offset, size; } sections[0];
     1.9  };
    1.10  
    1.11  #define RAZOR_MAGIC 0x7a7a7a7a
    1.12 @@ -168,7 +168,7 @@
    1.13  
    1.14  	for (i = 0; i < set->header->sections[i].type; i++) {
    1.15  		offset = set->header->sections[i].offset;
    1.16 -		size = set->header->sections[i + 1].offset - offset;
    1.17 +		size = set->header->sections[i].size;
    1.18  
    1.19  		switch (set->header->sections[i].type) {
    1.20  		case RAZOR_BUCKETS:
    1.21 @@ -252,30 +252,37 @@
    1.22  
    1.23  	header->sections[0].type = RAZOR_BUCKETS;
    1.24  	header->sections[0].offset = sizeof data;
    1.25 +	header->sections[0].size = set->buckets.alloc;
    1.26  
    1.27  	header->sections[1].type = RAZOR_STRINGS;
    1.28  	header->sections[1].offset =
    1.29  		header->sections[0].offset + set->buckets.alloc;
    1.30 +	header->sections[1].size = set->string_pool.size;
    1.31  
    1.32  	header->sections[2].type = RAZOR_PACKAGES;
    1.33  	header->sections[2].offset =
    1.34  		header->sections[1].offset + pool_size;
    1.35 +	header->sections[2].size = set->packages.size;
    1.36  
    1.37  	header->sections[3].type = RAZOR_REQUIRES;
    1.38  	header->sections[3].offset =
    1.39  		header->sections[2].offset + packages_size;
    1.40 +	header->sections[3].size = set->requires.size;
    1.41  
    1.42  	header->sections[4].type = RAZOR_PROVIDES;
    1.43  	header->sections[4].offset =
    1.44  		header->sections[3].offset + requires_size;
    1.45 +	header->sections[4].size = set->provides.size;
    1.46  
    1.47  	header->sections[5].type = RAZOR_PROPERTIES;
    1.48  	header->sections[5].offset =
    1.49  		header->sections[4].offset + provides_size;
    1.50 +	header->sections[5].size = set->property_pool.size;
    1.51  
    1.52  	header->sections[6].type = 0;
    1.53  	header->sections[6].offset =
    1.54  		header->sections[5].offset + properties_size;
    1.55 +	header->sections[6].size = 0;
    1.56  
    1.57  	fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
    1.58  	if (fd < 0)
    1.59 @@ -700,9 +707,6 @@
    1.60  static struct razor_set *
    1.61  razor_finish_import(struct import_context *ctx)
    1.62  {
    1.63 -	struct razor_package *pkg;
    1.64 -	struct razor_property *prop;
    1.65 -
    1.66  	qsort_set = ctx->set;
    1.67  
    1.68  	ctx->requires_map =
    1.69 @@ -716,15 +720,6 @@
    1.70  	free(ctx->provides.all.data);
    1.71  	free(ctx->requires_map);
    1.72  	free(ctx->provides_map);
    1.73 -
    1.74 -	/* FIXME: We add sentinel package/props here, but we should
    1.75 -	 * probably just have a size field in the header section. */
    1.76 -	pkg = array_add(&ctx->set->packages, sizeof *pkg);
    1.77 -	pkg->name = 0;
    1.78 -	prop = array_add(&ctx->set->requires, sizeof *prop);
    1.79 -	prop->name = 0;
    1.80 -	prop = array_add(&ctx->set->provides, sizeof *prop);
    1.81 -	prop->name = 0;
    1.82  		
    1.83  	fprintf(stderr, "parsed %d requires, %d unique\n",
    1.84  		ctx->requires.all.size / sizeof(struct import_property),
    1.85 @@ -744,7 +739,7 @@
    1.86  
    1.87  	pool = set->string_pool.data;
    1.88  	end = set->packages.data + set->packages.size;
    1.89 -	for (p = set->packages.data; p < end && p->name; p++)
    1.90 +	for (p = set->packages.data; p < end; p++)
    1.91  		printf("%s %s\n", &pool[p->name], &pool[p->version]);
    1.92  }
    1.93  
    1.94 @@ -756,7 +751,7 @@
    1.95  
    1.96  	name = razor_set_lookup(set, package);
    1.97  	end = set->packages.data + set->packages.size;
    1.98 -	for (p = set->packages.data; p < end && p->name; p++)
    1.99 +	for (p = set->packages.data; p < end; p++)
   1.100  		if (p->name == name)
   1.101  			return p;
   1.102  
   1.103 @@ -771,7 +766,7 @@
   1.104  
   1.105  	pool = set->string_pool.data;
   1.106  	end = properties->data + properties->size;
   1.107 -	for (p = properties->data; p < end && p->name; p++)
   1.108 +	for (p = properties->data; p < end; p++)
   1.109  		printf("%s %s\n", &pool[p->name], &pool[p->version]);
   1.110  }
   1.111