razor.c
changeset 8 7820b7d94662
parent 7 235f7daf817c
child 9 c4338a14dd9f
     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);