razor.c
changeset 13 6a715b310792
parent 12 71a410830f3d
child 14 d21d74d6e297
     1.1 --- a/razor.c	Fri Sep 07 00:09:18 2007 -0400
     1.2 +++ b/razor.c	Fri Sep 07 11:56:04 2007 -0400
     1.3 @@ -15,6 +15,18 @@
     1.4  	int size, alloc;
     1.5  };
     1.6  
     1.7 +static void
     1.8 +array_init(struct array *array)
     1.9 +{
    1.10 +	memset(array, 0, sizeof *array);
    1.11 +}
    1.12 +
    1.13 +static void
    1.14 +array_release(struct array *array)
    1.15 +{
    1.16 +	free(array->data);
    1.17 +}
    1.18 +
    1.19  static void *
    1.20  array_add(struct array *array, int size)
    1.21  {
    1.22 @@ -388,53 +400,14 @@
    1.23  	return value;
    1.24  }
    1.25  
    1.26 -static unsigned long
    1.27 -razor_set_add_package(struct razor_set *set,
    1.28 -		      unsigned long name, unsigned long version)
    1.29 -{
    1.30 -	struct razor_package *p;
    1.31 -
    1.32 -	p = array_add(&set->packages, sizeof *p);
    1.33 -
    1.34 -	p->name = name;
    1.35 -	p->version = version;
    1.36 -
    1.37 -	return p - (struct razor_package *) set->packages.data;
    1.38 -}
    1.39 -
    1.40 -static unsigned long
    1.41 -razor_set_add_requires(struct razor_set *set,
    1.42 -		       unsigned long name, unsigned long version)
    1.43 -{
    1.44 -	struct razor_property *p;
    1.45 -
    1.46 -	p = array_add(&set->requires, sizeof *p);
    1.47 -
    1.48 -	p->name = name;
    1.49 -	p->version = version;
    1.50 -
    1.51 -	return p - (struct razor_property *) set->requires.data;
    1.52 -}
    1.53 -
    1.54 -static unsigned long
    1.55 -razor_set_add_provides(struct razor_set *set,
    1.56 -		       unsigned long name, unsigned long version)
    1.57 -{
    1.58 -	struct razor_property *p;
    1.59 -
    1.60 -	p = array_add(&set->provides, sizeof *p);
    1.61 -
    1.62 -	p->name = name;
    1.63 -	p->version = version;
    1.64 -
    1.65 -	return p - (struct razor_property *) set->provides.data;
    1.66 -}
    1.67 -
    1.68  unsigned long
    1.69  razor_set_tokenize(struct razor_set *set, const char *string)
    1.70  {
    1.71  	unsigned long token;
    1.72  
    1.73 +	if (string == NULL)
    1.74 +		return 0;
    1.75 +
    1.76  	token = razor_set_lookup(set, string);
    1.77  	if (token != 0)
    1.78  		return token;
    1.79 @@ -442,15 +415,15 @@
    1.80  	return razor_set_insert(set, string);
    1.81  }
    1.82  
    1.83 -struct property_context {
    1.84 +struct import_property_context {
    1.85  	struct array all;
    1.86  	struct array package;
    1.87  };
    1.88  
    1.89  struct import_context {
    1.90  	struct razor_set *set;
    1.91 -	struct property_context requires;
    1.92 -	struct property_context provides;
    1.93 +	struct import_property_context requires;
    1.94 +	struct import_property_context provides;
    1.95  	unsigned long package;
    1.96  	unsigned long *requires_map;
    1.97  	unsigned long *provides_map;
    1.98 @@ -465,59 +438,92 @@
    1.99  };
   1.100  
   1.101  static void
   1.102 +import_context_add_package(struct import_context *ctx,
   1.103 +			   const char *name, const char *version)
   1.104 +{
   1.105 +	struct razor_package *p;
   1.106 +
   1.107 +	p = array_add(&ctx->set->packages, sizeof *p);
   1.108 +	p->name = razor_set_tokenize(ctx->set, name);
   1.109 +	p->version = razor_set_tokenize(ctx->set, version);
   1.110 +
   1.111 +	ctx->package = p - (struct razor_package *) ctx->set->packages.data;
   1.112 +	array_init(&ctx->requires.package);
   1.113 +	array_init(&ctx->provides.package);
   1.114 +}
   1.115 +
   1.116 +void
   1.117 +import_context_finish_package(struct import_context *ctx)
   1.118 +{
   1.119 +	struct razor_package *p;
   1.120 +
   1.121 +	p = (struct razor_package *) ctx->set->packages.data + ctx->package;
   1.122 +	p->requires = add_to_property_pool(ctx->set, &ctx->requires.package);
   1.123 +	p->provides = add_to_property_pool(ctx->set, &ctx->provides.package);
   1.124 +
   1.125 +	array_release(&ctx->requires.package);
   1.126 +	array_release(&ctx->provides.package);
   1.127 +}
   1.128 +
   1.129 +static void
   1.130 +import_context_add_property(struct import_context *ctx,
   1.131 +			    struct import_property_context *pctx,
   1.132 +			    const char *name, const char *version)
   1.133 +{
   1.134 +	struct import_property *p;
   1.135 +	unsigned long *r;
   1.136 +
   1.137 +	p = array_add(&pctx->all, sizeof *p);
   1.138 +	p->name = razor_set_tokenize(ctx->set, name);
   1.139 +	p->version = razor_set_tokenize(ctx->set, version);
   1.140 +	p->package = ctx->package;
   1.141 +	p->index = p - (struct import_property *) pctx->all.data;
   1.142 +
   1.143 +	r = array_add(&pctx->package, sizeof *r);
   1.144 +	*r = p->index;
   1.145 +}
   1.146 +
   1.147 +static void
   1.148  parse_package(struct import_context *ctx, const char **atts, void *data)
   1.149  {
   1.150 -	unsigned long name = 0, version = 0;
   1.151 +	const char *name = NULL, *version = NULL;
   1.152  	int i;
   1.153  
   1.154  	for (i = 0; atts[i]; i += 2) {
   1.155  		if (strcmp(atts[i], "name") == 0)
   1.156 -			name = razor_set_tokenize(ctx->set, atts[i + 1]);
   1.157 +			name = atts[i + 1];
   1.158  		else if (strcmp(atts[i], "version") == 0)
   1.159 -			version = razor_set_tokenize(ctx->set, atts[i + 1]);
   1.160 +			version = atts[i + 1];
   1.161  	}
   1.162  
   1.163 -	if (name == 0 || version == 0) {
   1.164 +	if (name == NULL || version == NULL) {
   1.165  		fprintf(stderr, "invalid package tag, "
   1.166  			"missing name or version attributes\n");
   1.167  		return;
   1.168  	}
   1.169  
   1.170 -	ctx->package = razor_set_add_package(ctx->set, name, version);
   1.171 -	memset(&ctx->requires.package, 0, sizeof ctx->requires.package);
   1.172 -	memset(&ctx->provides.package, 0, sizeof ctx->provides.package);
   1.173 -
   1.174 -	return;
   1.175 +	import_context_add_package(ctx, name, version);
   1.176  }
   1.177  
   1.178  static void
   1.179  parse_property(struct import_context *ctx, const char **atts, void *data)
   1.180  {
   1.181 -	unsigned long name = 0, version = 0, *r;
   1.182 -	struct import_property *p;
   1.183 -	struct property_context *pctx = data;
   1.184 +	const char *name = NULL, *version = NULL;
   1.185  	int i;
   1.186  
   1.187  	for (i = 0; atts[i]; i += 2) {
   1.188  		if (strcmp(atts[i], "name") == 0)
   1.189 -			name = razor_set_tokenize(ctx->set, atts[i + 1]);
   1.190 +			name = atts[i + 1];
   1.191  		if (strcmp(atts[i], "version") == 0)
   1.192 -			version = razor_set_tokenize(ctx->set, atts[i + 1]);
   1.193 +			version = atts[i + 1];
   1.194  	}
   1.195  	
   1.196 -	if (name == 0) {
   1.197 +	if (name == NULL) {
   1.198  		fprintf(stderr, "invalid tag, missing name attribute\n");
   1.199  		return;
   1.200  	}
   1.201  
   1.202 -	p = array_add(&pctx->all, sizeof *p);
   1.203 -	p->name = name;
   1.204 -	p->version = version;
   1.205 -	p->package = ctx->package;
   1.206 -	p->index = p - (struct import_property *) pctx->all.data;
   1.207 -
   1.208 -	r = array_add(&pctx->package, sizeof *r);
   1.209 -	*r = p->index;
   1.210 +	import_context_add_property(ctx, data, name, version);
   1.211  }
   1.212  
   1.213  static void
   1.214 @@ -537,19 +543,9 @@
   1.215  end_element (void *data, const char *name)
   1.216  {
   1.217  	struct import_context *ctx = data;
   1.218 -	struct razor_package *package;
   1.219  
   1.220 -	if (strcmp(name, "package") == 0) {
   1.221 -		package = (struct razor_package *) ctx->set->packages.data +
   1.222 -			ctx->package;
   1.223 -		package->requires =
   1.224 -			add_to_property_pool(ctx->set, &ctx->requires.package);
   1.225 -		package->provides =
   1.226 -			add_to_property_pool(ctx->set, &ctx->provides.package);
   1.227 -		free(ctx->requires.package.data);
   1.228 -		free(ctx->provides.package.data);
   1.229 -		ctx->package = 0;
   1.230 -	}
   1.231 +	if (strcmp(name, "package") == 0)
   1.232 +		import_context_finish_package(ctx);
   1.233  }
   1.234  
   1.235  static char *
   1.236 @@ -572,14 +568,14 @@
   1.237  }
   1.238  
   1.239  static void
   1.240 -razor_set_prepare_import(struct razor_set *set, struct import_context *ctx)
   1.241 +razor_prepare_import(struct import_context *ctx)
   1.242  {
   1.243  	memset(ctx, 0, sizeof *ctx);
   1.244 -	ctx->set = set;
   1.245 +	ctx->set = razor_set_create();
   1.246  }
   1.247  
   1.248  static int
   1.249 -razor_set_import(struct import_context *ctx, const char *filename)
   1.250 +razor_import(struct import_context *ctx, const char *filename)
   1.251  {
   1.252  	SHA_CTX sha1;
   1.253  	XML_Parser parser;
   1.254 @@ -701,9 +697,12 @@
   1.255  	      sizeof(struct razor_package), compare_packages);
   1.256  }
   1.257  
   1.258 -static void
   1.259 -razor_set_finish_import(struct import_context *ctx)
   1.260 +static struct razor_set *
   1.261 +razor_finish_import(struct import_context *ctx)
   1.262  {
   1.263 +	struct razor_package *pkg;
   1.264 +	struct razor_property *prop;
   1.265 +
   1.266  	qsort_set = ctx->set;
   1.267  
   1.268  	ctx->requires_map =
   1.269 @@ -718,15 +717,25 @@
   1.270  	free(ctx->requires_map);
   1.271  	free(ctx->provides_map);
   1.272  
   1.273 +	/* FIXME: We add sentinel package/props here, but we should
   1.274 +	 * probably just have a size field in the header section. */
   1.275 +	pkg = array_add(&ctx->set->packages, sizeof *pkg);
   1.276 +	pkg->name = 0;
   1.277 +	prop = array_add(&ctx->set->requires, sizeof *prop);
   1.278 +	prop->name = 0;
   1.279 +	prop = array_add(&ctx->set->provides, sizeof *prop);
   1.280 +	prop->name = 0;
   1.281 +		
   1.282  	fprintf(stderr, "parsed %d requires, %d unique\n",
   1.283  		ctx->requires.all.size / sizeof(struct import_property),
   1.284  		ctx->set->requires.size / sizeof(struct razor_property));
   1.285  	fprintf(stderr, "parsed %d provides, %d unique\n",
   1.286  		ctx->provides.all.size / sizeof(struct import_property),
   1.287  		ctx->set->provides.size / sizeof(struct razor_property));
   1.288 +
   1.289 +	return ctx->set; 
   1.290  }
   1.291  
   1.292 -
   1.293  void
   1.294  razor_set_list(struct razor_set *set)
   1.295  {
   1.296 @@ -866,26 +875,17 @@
   1.297  			exit(-1);
   1.298  		}
   1.299  			
   1.300 -		set = razor_set_create();
   1.301 -
   1.302 -		razor_set_prepare_import(set, &ctx);
   1.303 +		razor_prepare_import(&ctx);
   1.304  
   1.305  		for (i = 2; i < argc; i++) {
   1.306 -			if (razor_set_import(&ctx, argv[i]) < 0) {
   1.307 +			if (razor_import(&ctx, argv[i]) < 0) {
   1.308  				fprintf(stderr, "failed to import %s\n",
   1.309  					argv[i]);
   1.310  				exit(-1);
   1.311  			}
   1.312  		}
   1.313  
   1.314 -		razor_set_finish_import(&ctx);
   1.315 -
   1.316 -		/* FIXME: We add a sentinel package here, but we
   1.317 -		 * should probably just have a size field in the
   1.318 -		 * header section. */
   1.319 -		razor_set_add_package(set, 0, 0);
   1.320 -		razor_set_add_requires(set, 0, 0);
   1.321 -		razor_set_add_provides(set, 0, 0);
   1.322 +		set = razor_finish_import(&ctx);
   1.323  
   1.324  		printf("bucket allocation: %d\n", set->buckets.alloc);
   1.325  		printf("pool size: %d\n", set->string_pool.size);