Refactor the import interface and make it opaque.
authorKristian H?gsberg <krh@redhat.com>
Wed Sep 19 15:26:25 2007 -0400 (2007-09-19)
changeset 30702c01e59497
parent 29 28a13008d80b
child 31 50fd9002d5ee
Refactor the import interface and make it opaque.
import.c
razor.c
razor.h
     1.1 --- a/import.c	Wed Sep 19 14:34:11 2007 -0400
     1.2 +++ b/import.c	Wed Sep 19 15:26:25 2007 -0400
     1.3 @@ -15,7 +15,7 @@
     1.4  #include "razor.h"
     1.5  
     1.6  static void
     1.7 -parse_package(struct import_context *ctx, const char **atts, void *data)
     1.8 +parse_package(struct razor_importer *importer, const char **atts, void *data)
     1.9  {
    1.10  	const char *name = NULL, *version = NULL;
    1.11  	int i;
    1.12 @@ -33,11 +33,15 @@
    1.13  		return;
    1.14  	}
    1.15  
    1.16 -	import_context_add_package(ctx, name, version);
    1.17 +	razor_importer_begin_package(importer, name, version);
    1.18  }
    1.19  
    1.20 +enum {
    1.21 +	RZR_REQUIRES, RZR_PROVIDES
    1.22 +};
    1.23 +
    1.24  static void
    1.25 -parse_property(struct import_context *ctx, const char **atts, void *data)
    1.26 +parse_property(struct razor_importer *importer, const char **atts, void *data)
    1.27  {
    1.28  	const char *name = NULL, *version = NULL;
    1.29  	int i;
    1.30 @@ -54,33 +58,40 @@
    1.31  		return;
    1.32  	}
    1.33  
    1.34 -	import_context_add_property(ctx, data, name, version);
    1.35 +	switch ((int) data) {
    1.36 +	case RZR_REQUIRES:
    1.37 +		razor_importer_add_requires(importer, name, version);
    1.38 +		break;
    1.39 +	case RZR_PROVIDES:
    1.40 +		razor_importer_add_provides(importer, name, version);
    1.41 +		break;
    1.42 +	}
    1.43  }
    1.44  
    1.45  static void
    1.46  start_element(void *data, const char *name, const char **atts)
    1.47  {
    1.48 -	struct import_context *ctx = data;
    1.49 +	struct razor_importer *importer = data;
    1.50  
    1.51  	if (strcmp(name, "package") == 0)
    1.52 -		parse_package(ctx, atts, NULL);
    1.53 +		parse_package(importer, atts, NULL);
    1.54  	else if (strcmp(name, "requires") == 0)
    1.55 -		parse_property(ctx, atts, &ctx->requires);
    1.56 +		parse_property(importer, atts, (void *) RZR_REQUIRES);
    1.57  	else if (strcmp(name, "provides") == 0)
    1.58 -		parse_property(ctx, atts, &ctx->provides);
    1.59 +		parse_property(importer, atts, (void*) RZR_PROVIDES);
    1.60  }
    1.61  
    1.62  static void
    1.63  end_element (void *data, const char *name)
    1.64  {
    1.65 -	struct import_context *ctx = data;
    1.66 +	struct razor_importer *importer = data;
    1.67  
    1.68  	if (strcmp(name, "package") == 0)
    1.69 -		import_context_finish_package(ctx);
    1.70 +		razor_importer_finish_package(importer);
    1.71  }
    1.72  
    1.73  static int
    1.74 -import_rzr_file(struct import_context *ctx, const char *filename)
    1.75 +import_rzr_file(struct razor_importer *importer, const char *filename)
    1.76  {
    1.77  	SHA_CTX sha1;
    1.78  	XML_Parser parser;
    1.79 @@ -97,7 +108,7 @@
    1.80  		return -1;
    1.81  
    1.82  	parser = XML_ParserCreate(NULL);
    1.83 -	XML_SetUserData(parser, ctx);
    1.84 +	XML_SetUserData(parser, importer);
    1.85  	XML_SetElementHandler(parser, start_element, end_element);
    1.86  	if (XML_Parse(parser, p, stat.st_size, 1) == XML_STATUS_ERROR) {
    1.87  		fprintf(stderr,
    1.88 @@ -124,30 +135,32 @@
    1.89  struct razor_set *
    1.90  razor_import_rzr_files(int count, const char *files[])
    1.91  {
    1.92 -	struct import_context ctx;
    1.93 +	struct razor_importer *importer;
    1.94  	int i;
    1.95  
    1.96 -	razor_prepare_import(&ctx);
    1.97 +	importer = razor_importer_new();
    1.98  
    1.99  	for (i = 0; i < count; i++) {
   1.100 -		if (import_rzr_file(&ctx, files[i]) < 0) {
   1.101 +		if (import_rzr_file(importer, files[i]) < 0) {
   1.102  			fprintf(stderr, "failed to import %s\n", files[i]);
   1.103  			exit(-1);
   1.104  		}
   1.105  	}
   1.106  
   1.107 -	return razor_finish_import(&ctx);
   1.108 +	return razor_importer_finish(importer);
   1.109  }
   1.110  
   1.111  /* Import a yum filelist as a razor package set. */
   1.112  
   1.113  enum {
   1.114  	YUM_STATE_BEGIN,
   1.115 -	YUM_STATE_PACKAGE_NAME
   1.116 +	YUM_STATE_PACKAGE_NAME,
   1.117 +	YUM_STATE_REQUIRES,
   1.118 +	YUM_STATE_PROVIDES
   1.119  };
   1.120  
   1.121  struct yum_context {
   1.122 -	struct import_context ctx;
   1.123 +	struct razor_importer *importer;
   1.124  	struct import_property_context *current_property_context;
   1.125  	char *name;
   1.126  	int state;
   1.127 @@ -168,13 +181,13 @@
   1.128  			if (strcmp(atts[i], "ver") == 0)
   1.129  				version = atts[i + 1];
   1.130  		}
   1.131 -		import_context_add_package(&ctx->ctx, ctx->name, version);
   1.132 +		razor_importer_begin_package(ctx->importer, ctx->name, version);
   1.133  	} else if (strcmp(name, "rpm:requires") == 0) {
   1.134 -		ctx->current_property_context = &ctx->ctx.requires;
   1.135 +		ctx->state = YUM_STATE_REQUIRES;
   1.136  	} else if (strcmp(name, "rpm:provides") == 0) {
   1.137 -		ctx->current_property_context = &ctx->ctx.provides;
   1.138 +		ctx->state = YUM_STATE_PROVIDES;
   1.139  	} else if (strcmp(name, "rpm:entry") == 0 &&
   1.140 -		   ctx->current_property_context != NULL) {
   1.141 +		   ctx->state != YUM_STATE_BEGIN) {
   1.142  		n = NULL;
   1.143  		version = NULL;
   1.144  		for (i = 0; atts[i]; i += 2) {
   1.145 @@ -190,9 +203,15 @@
   1.146  			return;
   1.147  		}
   1.148  
   1.149 -		import_context_add_property(&ctx->ctx,
   1.150 -					    ctx->current_property_context,
   1.151 -					    n, version);
   1.152 +		switch (ctx->state) {
   1.153 +		case YUM_STATE_REQUIRES:
   1.154 +			razor_importer_add_requires(ctx->importer, n, version);
   1.155 +			break;
   1.156 +		case YUM_STATE_PROVIDES:
   1.157 +			razor_importer_add_provides(ctx->importer, n, version);
   1.158 +			break;
   1.159 +		}
   1.160 +
   1.161  	}
   1.162  }
   1.163  
   1.164 @@ -203,13 +222,13 @@
   1.165  
   1.166  	if (strcmp(name, "package") == 0) {
   1.167  		free(ctx->name);
   1.168 -		import_context_finish_package(&ctx->ctx);
   1.169 +		razor_importer_finish_package(ctx->importer);
   1.170  	} else if (strcmp(name, "name") == 0) {
   1.171 -		ctx->state = 0;
   1.172 +		ctx->state = YUM_STATE_BEGIN;
   1.173  	} else if (strcmp(name, "rpm:requires") == 0) {
   1.174 -		ctx->current_property_context = NULL;
   1.175 +		ctx->state = YUM_STATE_BEGIN;
   1.176  	} else if (strcmp(name, "rpm:provides") == 0) {
   1.177 -		ctx->current_property_context = NULL;
   1.178 +		ctx->state = YUM_STATE_BEGIN;
   1.179  	}
   1.180  }
   1.181  
   1.182 @@ -230,7 +249,7 @@
   1.183  	char buf[4096];
   1.184  	int len;
   1.185  
   1.186 -	razor_prepare_import(&ctx.ctx);
   1.187 +	ctx.importer = razor_importer_new();	
   1.188  
   1.189  	parser = XML_ParserCreate(NULL);
   1.190  	XML_SetUserData(parser, &ctx);
   1.191 @@ -257,13 +276,13 @@
   1.192  
   1.193  	XML_ParserFree(parser);
   1.194  
   1.195 -	return razor_finish_import(&ctx.ctx);
   1.196 +	return razor_importer_finish(ctx.importer);
   1.197  }
   1.198  
   1.199  struct razor_set *
   1.200  razor_set_create_from_rpmdb(void)
   1.201  {
   1.202 -	struct import_context ctx;
   1.203 +	struct razor_importer *importer;
   1.204  	rpmdbMatchIterator iter;
   1.205  	Header h;
   1.206  	int_32 type, count, i;
   1.207 @@ -278,7 +297,7 @@
   1.208  		exit(1);
   1.209  	}
   1.210  
   1.211 -	razor_prepare_import(&ctx);
   1.212 +	importer = razor_importer_new();
   1.213  
   1.214  	iter = rpmdbInitIterator(db, 0, NULL, 0);
   1.215  	while (h = rpmdbNextIterator(iter), h != NULL) {
   1.216 @@ -288,16 +307,14 @@
   1.217  			       (void **) &version, &count);
   1.218  		headerGetEntry(h, RPMTAG_RELEASE, &type,
   1.219  			       (void **) &release, &count);
   1.220 -		import_context_add_package(&ctx, name, version);
   1.221 -
   1.222 +		razor_importer_begin_package(importer, name, version);
   1.223  
   1.224  		headerGetEntry(h, RPMTAG_REQUIRES, &type,
   1.225  			       (void **) &properties, &count);
   1.226  		headerGetEntry(h, RPMTAG_REQUIREVERSION, &type,
   1.227  			       (void **) &property_versions, &count);
   1.228  		for (i = 0; i < count; i++)
   1.229 -			import_context_add_property(&ctx,
   1.230 -						    &ctx.requires,
   1.231 +			razor_importer_add_requires(importer,
   1.232  						    properties[i],
   1.233  						    property_versions[i]);
   1.234  
   1.235 @@ -306,15 +323,14 @@
   1.236  		headerGetEntry(h, RPMTAG_PROVIDEVERSION, &type,
   1.237  			       (void **) &property_versions, &count);
   1.238  		for (i = 0; i < count; i++)
   1.239 -			import_context_add_property(&ctx,
   1.240 -						    &ctx.provides,
   1.241 +			razor_importer_add_provides(importer,
   1.242  						    properties[i],
   1.243  						    property_versions[i]);
   1.244  
   1.245 -		import_context_finish_package(&ctx);
   1.246 +		razor_importer_finish_package(importer);
   1.247  	}
   1.248  
   1.249  	rpmdbClose(db);
   1.250  
   1.251 -	return razor_finish_import(&ctx);
   1.252 +	return razor_importer_finish(importer);
   1.253  }
     2.1 --- a/razor.c	Wed Sep 19 14:34:11 2007 -0400
     2.2 +++ b/razor.c	Wed Sep 19 15:26:25 2007 -0400
     2.3 @@ -13,6 +13,71 @@
     2.4  
     2.5  #include "razor.h"
     2.6  
     2.7 +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     2.8 +
     2.9 +struct array {
    2.10 +	void *data;
    2.11 +	int size, alloc;
    2.12 +};
    2.13 +
    2.14 +struct razor_set_section {
    2.15 +	unsigned int type;
    2.16 +	unsigned int offset;
    2.17 +	unsigned int size;
    2.18 +};
    2.19 +
    2.20 +struct razor_set_header {
    2.21 +	unsigned int magic;
    2.22 +	unsigned int version;
    2.23 +	struct razor_set_section sections[0];
    2.24 +};
    2.25 +
    2.26 +#define RAZOR_MAGIC 0x7a7a7a7a
    2.27 +#define RAZOR_VERSION 1
    2.28 +
    2.29 +#define RAZOR_PACKAGES 0
    2.30 +#define RAZOR_REQUIRES 1
    2.31 +#define RAZOR_PROVIDES 2
    2.32 +#define RAZOR_STRING_POOL 3
    2.33 +#define RAZOR_PROPERTY_POOL 4
    2.34 +
    2.35 +struct razor_package {
    2.36 +	unsigned long name;
    2.37 +	unsigned long version;
    2.38 +	unsigned long requires;
    2.39 +	unsigned long provides;
    2.40 +};
    2.41 +
    2.42 +struct razor_property {
    2.43 +	unsigned long name;
    2.44 +	unsigned long version;
    2.45 +	unsigned long packages;
    2.46 +};
    2.47 +
    2.48 +struct razor_set {
    2.49 +	struct array buckets;
    2.50 +	struct array string_pool;
    2.51 +	struct array property_pool;
    2.52 + 	struct array packages;
    2.53 + 	struct array requires;
    2.54 + 	struct array provides;
    2.55 +	struct razor_set_header *header;
    2.56 +};
    2.57 +
    2.58 +struct import_property_context {
    2.59 +	struct array *all;
    2.60 +	struct array package;
    2.61 +};
    2.62 +
    2.63 +struct razor_importer {
    2.64 +	struct razor_set *set;
    2.65 +	struct import_property_context requires;
    2.66 +	struct import_property_context provides;
    2.67 +	struct razor_package *package;
    2.68 +	unsigned long *requires_map;
    2.69 +	unsigned long *provides_map;
    2.70 +};
    2.71 +
    2.72  static void
    2.73  array_init(struct array *array)
    2.74  {
    2.75 @@ -305,7 +370,7 @@
    2.76  	return value;
    2.77  }
    2.78  
    2.79 -unsigned long
    2.80 +static unsigned long
    2.81  razor_set_tokenize(struct razor_set *set, const char *string)
    2.82  {
    2.83  	unsigned long token;
    2.84 @@ -321,35 +386,37 @@
    2.85  }
    2.86  
    2.87  void
    2.88 -import_context_add_package(struct import_context *ctx,
    2.89 -			   const char *name, const char *version)
    2.90 +razor_importer_begin_package(struct razor_importer *importer,
    2.91 +			     const char *name, const char *version)
    2.92  {
    2.93  	struct razor_package *p;
    2.94  
    2.95 -	p = array_add(&ctx->set->packages, sizeof *p);
    2.96 -	p->name = razor_set_tokenize(ctx->set, name);
    2.97 -	p->version = razor_set_tokenize(ctx->set, version);
    2.98 +	p = array_add(&importer->set->packages, sizeof *p);
    2.99 +	p->name = razor_set_tokenize(importer->set, name);
   2.100 +	p->version = razor_set_tokenize(importer->set, version);
   2.101  
   2.102 -	ctx->package = p;
   2.103 -	array_init(&ctx->requires.package);
   2.104 -	array_init(&ctx->provides.package);
   2.105 +	importer->package = p;
   2.106 +	array_init(&importer->requires.package);
   2.107 +	array_init(&importer->provides.package);
   2.108  }
   2.109  
   2.110  void
   2.111 -import_context_finish_package(struct import_context *ctx)
   2.112 +razor_importer_finish_package(struct razor_importer *importer)
   2.113  {
   2.114  	struct razor_package *p;
   2.115  
   2.116 -	p = ctx->package;
   2.117 -	p->requires = add_to_property_pool(ctx->set, &ctx->requires.package);
   2.118 -	p->provides = add_to_property_pool(ctx->set, &ctx->provides.package);
   2.119 +	p = importer->package;
   2.120 +	p->requires = add_to_property_pool(importer->set,
   2.121 +					   &importer->requires.package);
   2.122 +	p->provides = add_to_property_pool(importer->set,
   2.123 +					   &importer->provides.package);
   2.124  
   2.125 -	array_release(&ctx->requires.package);
   2.126 -	array_release(&ctx->provides.package);
   2.127 +	array_release(&importer->requires.package);
   2.128 +	array_release(&importer->provides.package);
   2.129  }
   2.130  
   2.131 -void
   2.132 -import_context_add_property(struct import_context *ctx,
   2.133 +static void
   2.134 +razor_importer_add_property(struct razor_importer *importer,
   2.135  			    struct import_property_context *pctx,
   2.136  			    const char *name, const char *version)
   2.137  {
   2.138 @@ -357,22 +424,42 @@
   2.139  	unsigned long *r;
   2.140  
   2.141  	p = array_add(pctx->all, sizeof *p);
   2.142 -	p->name = razor_set_tokenize(ctx->set, name);
   2.143 -	p->version = razor_set_tokenize(ctx->set, version);
   2.144 -	p->packages = ctx->package -
   2.145 -		(struct razor_package *) ctx->set->packages.data;
   2.146 +	p->name = razor_set_tokenize(importer->set, name);
   2.147 +	p->version = razor_set_tokenize(importer->set, version);
   2.148 +	p->packages = importer->package -
   2.149 +		(struct razor_package *) importer->set->packages.data;
   2.150  
   2.151  	r = array_add(&pctx->package, sizeof *r);
   2.152  	*r = p - (struct razor_property *) pctx->all->data;
   2.153  }
   2.154  
   2.155  void
   2.156 -razor_prepare_import(struct import_context *ctx)
   2.157 +razor_importer_add_requires(struct razor_importer *importer,
   2.158 +			    const char *name, const char *version)
   2.159  {
   2.160 -	memset(ctx, 0, sizeof *ctx);
   2.161 -	ctx->set = razor_set_create();
   2.162 -	ctx->requires.all = &ctx->set->requires;
   2.163 -	ctx->provides.all = &ctx->set->provides;
   2.164 +	razor_importer_add_property(importer,
   2.165 +				    &importer->requires, name, version);
   2.166 +}
   2.167 +
   2.168 +void
   2.169 +razor_importer_add_provides(struct razor_importer *importer,
   2.170 +			    const char *name, const char *version)
   2.171 +{
   2.172 +	razor_importer_add_property(importer,
   2.173 +				    &importer->provides, name, version);
   2.174 +}
   2.175 +
   2.176 +struct razor_importer *
   2.177 +razor_importer_new(void)
   2.178 +{
   2.179 +	struct razor_importer *importer;
   2.180 +
   2.181 +	importer = zalloc(sizeof *importer);
   2.182 +	importer->set = razor_set_create();
   2.183 +	importer->requires.all = &importer->set->requires;
   2.184 +	importer->provides.all = &importer->set->provides;
   2.185 +
   2.186 +	return importer;
   2.187  }
   2.188  
   2.189  typedef int (*compare_with_data_func_t)(const void *p1,
   2.190 @@ -541,33 +628,33 @@
   2.191  }
   2.192  
   2.193  static void
   2.194 -remap_package_links(struct import_context *ctx)
   2.195 +remap_package_links(struct razor_importer *importer)
   2.196  {
   2.197  	struct razor_package *p, *end;
   2.198  	unsigned long *pool, *r;
   2.199  
   2.200 -	pool = ctx->set->property_pool.data;
   2.201 -	end = ctx->set->packages.data + ctx->set->packages.size;
   2.202 -	for (p = ctx->set->packages.data; p < end; p++) {
   2.203 +	pool = importer->set->property_pool.data;
   2.204 +	end = importer->set->packages.data + importer->set->packages.size;
   2.205 +	for (p = importer->set->packages.data; p < end; p++) {
   2.206  		for (r = &pool[p->requires]; ~*r; r++)
   2.207 -			*r = ctx->requires_map[*r];
   2.208 +			*r = importer->requires_map[*r];
   2.209  		for (r = &pool[p->provides]; ~*r; r++)
   2.210 -			*r = ctx->provides_map[*r];
   2.211 +			*r = importer->provides_map[*r];
   2.212  	}
   2.213  }
   2.214  
   2.215  static void
   2.216 -remap_property_links(struct import_context *ctx, unsigned long *map)
   2.217 +remap_property_links(struct razor_importer *importer, unsigned long *map)
   2.218  {
   2.219  	struct razor_property *p, *end;
   2.220  	struct razor_package *rp;
   2.221  	unsigned long *pool, *r, *rmap;
   2.222  	int i, count;
   2.223  
   2.224 -	pool = ctx->set->property_pool.data;
   2.225 -	count = ctx->set->packages.size / sizeof(struct razor_package);
   2.226 +	pool = importer->set->property_pool.data;
   2.227 +	count = importer->set->packages.size / sizeof(struct razor_package);
   2.228  	rmap = malloc(count * sizeof *map);
   2.229 -	rp = ctx->set->packages.data;
   2.230 +	rp = importer->set->packages.data;
   2.231  	for (i = 0; i < count; i++)
   2.232  		rmap[map[i]] = i;
   2.233  
   2.234 @@ -578,13 +665,13 @@
   2.235  	 * a flat pool.  Right now, as property lists and package
   2.236  	 * lists are mixed, we can't do that. */
   2.237  
   2.238 -	end = ctx->set->requires.data + ctx->set->requires.size;
   2.239 -	for (p = ctx->set->requires.data; p < end; p++)
   2.240 +	end = importer->set->requires.data + importer->set->requires.size;
   2.241 +	for (p = importer->set->requires.data; p < end; p++)
   2.242  		for (r = &pool[p->packages]; ~*r; r++)
   2.243  			*r = rmap[*r];
   2.244  
   2.245 -	end = ctx->set->provides.data + ctx->set->provides.size;
   2.246 -	for (p = ctx->set->provides.data; p < end; p++)
   2.247 +	end = importer->set->provides.data + importer->set->provides.size;
   2.248 +	for (p = importer->set->provides.data; p < end; p++)
   2.249  		for (r = &pool[p->packages]; ~*r; r++)
   2.250  			*r = rmap[*r];
   2.251  
   2.252 @@ -592,27 +679,33 @@
   2.253  }
   2.254  
   2.255  struct razor_set *
   2.256 -razor_finish_import(struct import_context *ctx)
   2.257 +razor_importer_finish(struct razor_importer *importer)
   2.258  {
   2.259 +	struct razor_set *set;
   2.260  	unsigned long *map;
   2.261  	int count;
   2.262  
   2.263 -	ctx->requires_map = uniqueify_properties(ctx->set, ctx->requires.all);
   2.264 -	ctx->provides_map = uniqueify_properties(ctx->set, ctx->provides.all);
   2.265 -	remap_package_links(ctx);
   2.266 -	free(ctx->requires_map);
   2.267 -	free(ctx->provides_map);
   2.268 +	importer->requires_map = uniqueify_properties(importer->set,
   2.269 +						      importer->requires.all);
   2.270 +	importer->provides_map = uniqueify_properties(importer->set,
   2.271 +						      importer->provides.all);
   2.272 +	remap_package_links(importer);
   2.273 +	free(importer->requires_map);
   2.274 +	free(importer->provides_map);
   2.275  
   2.276 -	count = ctx->set->packages.size / sizeof(struct razor_package);
   2.277 -	map = qsort_with_data(ctx->set->packages.data,
   2.278 +	count = importer->set->packages.size / sizeof(struct razor_package);
   2.279 +	map = qsort_with_data(importer->set->packages.data,
   2.280  			      count,
   2.281  			      sizeof(struct razor_package),
   2.282  			      compare_packages,
   2.283 -			      ctx->set);
   2.284 -	remap_property_links(ctx, map);
   2.285 +			      importer->set);
   2.286 +	remap_property_links(importer, map);
   2.287  	free(map);
   2.288  
   2.289 -	return ctx->set; 
   2.290 +	set = importer->set;
   2.291 +	free(importer);
   2.292 +
   2.293 +	return set;
   2.294  }
   2.295  
   2.296  void
     3.1 --- a/razor.h	Wed Sep 19 14:34:11 2007 -0400
     3.2 +++ b/razor.h	Wed Sep 19 15:26:25 2007 -0400
     3.3 @@ -1,81 +1,17 @@
     3.4  #ifndef _RAZOR_H_
     3.5  #define _RAZOR_H_
     3.6  
     3.7 -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     3.8 +struct razor_importer;
     3.9  
    3.10 -struct array {
    3.11 -	void *data;
    3.12 -	int size, alloc;
    3.13 -};
    3.14 -
    3.15 -struct razor_set_section {
    3.16 -	unsigned int type;
    3.17 -	unsigned int offset;
    3.18 -	unsigned int size;
    3.19 -};
    3.20 -
    3.21 -struct razor_set_header {
    3.22 -	unsigned int magic;
    3.23 -	unsigned int version;
    3.24 -	struct razor_set_section sections[0];
    3.25 -};
    3.26 -
    3.27 -#define RAZOR_MAGIC 0x7a7a7a7a
    3.28 -#define RAZOR_VERSION 1
    3.29 -
    3.30 -#define RAZOR_PACKAGES 0
    3.31 -#define RAZOR_REQUIRES 1
    3.32 -#define RAZOR_PROVIDES 2
    3.33 -#define RAZOR_STRING_POOL 3
    3.34 -#define RAZOR_PROPERTY_POOL 4
    3.35 -
    3.36 -struct razor_package {
    3.37 -	unsigned long name;
    3.38 -	unsigned long version;
    3.39 -	unsigned long requires;
    3.40 -	unsigned long provides;
    3.41 -};
    3.42 -
    3.43 -struct razor_property {
    3.44 -	unsigned long name;
    3.45 -	unsigned long version;
    3.46 -	unsigned long packages;
    3.47 -};
    3.48 -
    3.49 -struct razor_set {
    3.50 -	struct array buckets;
    3.51 -	struct array string_pool;
    3.52 -	struct array property_pool;
    3.53 - 	struct array packages;
    3.54 - 	struct array requires;
    3.55 - 	struct array provides;
    3.56 -	struct razor_set_header *header;
    3.57 -};
    3.58 -
    3.59 -struct import_property_context {
    3.60 -	struct array *all;
    3.61 -	struct array package;
    3.62 -};
    3.63 -
    3.64 -struct import_context {
    3.65 -	struct razor_set *set;
    3.66 -	struct import_property_context requires;
    3.67 -	struct import_property_context provides;
    3.68 -	struct razor_package *package;
    3.69 -	unsigned long *requires_map;
    3.70 -	unsigned long *provides_map;
    3.71 -};
    3.72 -
    3.73 -void import_context_add_package(struct import_context *ctx,
    3.74 +struct razor_importer *razor_importer_new(void);
    3.75 +void razor_importer_begin_package(struct razor_importer *importer,
    3.76  				const char *name, const char *version);
    3.77 -void import_context_add_property(struct import_context *ctx,
    3.78 -				 struct import_property_context *pctx,
    3.79 +void razor_importer_add_requires(struct razor_importer *importer,
    3.80  				 const char *name, const char *version);
    3.81 -void import_context_finish_package(struct import_context *ctx);
    3.82 -
    3.83 -unsigned long razor_set_tokenize(struct razor_set *set, const char *string);
    3.84 -void razor_prepare_import(struct import_context *ctx);
    3.85 -struct razor_set *razor_finish_import(struct import_context *ctx);
    3.86 +void razor_importer_add_provides(struct razor_importer *importer,
    3.87 +				 const char *name, const char *version);
    3.88 +void razor_importer_finish_package(struct razor_importer *importer);
    3.89 +struct razor_set *razor_importer_finish(struct razor_importer *importer);
    3.90  
    3.91  struct razor_set *razor_import_rzr_files(int count, const char **files);
    3.92  struct razor_set *razor_set_create_from_yum_filelist(int fd);