razor.c
changeset 53 a73c2ac05cbe
parent 49 c66fd9a1eabe
child 54 9e3907688d78
     1.1 --- a/razor.c	Sun Oct 21 22:41:14 2007 -0400
     1.2 +++ b/razor.c	Mon Oct 22 22:55:06 2007 -0400
     1.3 @@ -60,6 +60,7 @@
     1.4  	unsigned long name;
     1.5  	unsigned long count;
     1.6  	unsigned long start;
     1.7 +	unsigned long packages;
     1.8  };
     1.9  
    1.10  struct razor_set {
    1.11 @@ -74,6 +75,18 @@
    1.12  	struct razor_set_header *header;
    1.13  };
    1.14  
    1.15 +struct import_entry {
    1.16 +	unsigned long package;
    1.17 +	char *name;
    1.18 +};
    1.19 +
    1.20 +struct import_directory {
    1.21 +	unsigned long name, count;
    1.22 +	struct array files;
    1.23 +	struct array packages;
    1.24 +	struct import_directory *last;
    1.25 +};
    1.26 +
    1.27  struct import_property_context {
    1.28  	struct array *all;
    1.29  	struct array package;
    1.30 @@ -463,10 +476,13 @@
    1.31  void
    1.32  razor_importer_add_file(struct razor_importer *importer, const char *name)
    1.33  {
    1.34 -	char **p;
    1.35 +	struct import_entry *e;
    1.36  
    1.37 -	p = array_add(&importer->files, sizeof *p);
    1.38 -	*p = strdup(name);
    1.39 +	e = array_add(&importer->files, sizeof *e);
    1.40 +
    1.41 +	e->package = importer->package -
    1.42 +		(struct razor_package *) importer->set->packages.data;
    1.43 +	e->name = strdup(name);
    1.44  }
    1.45  
    1.46  struct razor_importer *
    1.47 @@ -699,22 +715,16 @@
    1.48  static int
    1.49  compare_filenames(const void *p1, const void *p2, void *data)
    1.50  {
    1.51 -	char *f1 = *(char **) p1;
    1.52 -	char *f2 = *(char **) p2;
    1.53 +	const struct import_entry *e1 = p1;
    1.54 +	const struct import_entry *e2 = p2;
    1.55  
    1.56 -	return strcmp(f1, f2);
    1.57 +	return strcmp(e1->name, e2->name);
    1.58  }
    1.59  
    1.60 -struct directory {
    1.61 -	unsigned long name, count;
    1.62 -	struct array files;
    1.63 -	struct directory *last;
    1.64 -};
    1.65 -
    1.66  static void
    1.67 -count_entries(struct directory *d)
    1.68 +count_entries(struct import_directory *d)
    1.69  {
    1.70 -	struct directory *p, *end;
    1.71 +	struct import_directory *p, *end;
    1.72  
    1.73  	p = d->files.data;
    1.74  	end = d->files.data + d->files.size;
    1.75 @@ -727,9 +737,10 @@
    1.76  }
    1.77  
    1.78  static void
    1.79 -serialize_files(struct directory *d, struct array *array)
    1.80 +serialize_files(struct razor_set *set,
    1.81 +		struct import_directory *d, struct array *array)
    1.82  {
    1.83 -	struct directory *p, *end;
    1.84 +	struct import_directory *p, *end;
    1.85  	struct razor_entry *e;
    1.86  	unsigned long s;
    1.87  
    1.88 @@ -742,13 +753,16 @@
    1.89  		e->count = p->files.size / sizeof *p;
    1.90  		e->start = s;
    1.91  		s += p->count;
    1.92 +		e->packages = add_to_property_pool(&set->package_pool,
    1.93 +						   &p->packages);
    1.94 +		array_release(&p->packages);
    1.95  		p++;
    1.96  	}		
    1.97  
    1.98  	p = d->files.data;
    1.99  	end = d->files.data + d->files.size;
   1.100  	while (p < end) {
   1.101 -		serialize_files(p, array);
   1.102 +		serialize_files(set, p, array);
   1.103  		p++;
   1.104  	}
   1.105  }
   1.106 @@ -757,26 +771,28 @@
   1.107  build_file_tree(struct razor_importer *importer)
   1.108  {
   1.109  	int count, i, length;
   1.110 -	char **filenames, *f, *end;
   1.111 -	unsigned long name;
   1.112 +	struct import_entry *filenames;
   1.113 +	char *f, *end;
   1.114 +	unsigned long name, *r;
   1.115  	char dirname[256];
   1.116 -	struct directory *d, root;
   1.117 +	struct import_directory *d, root;
   1.118  	struct razor_entry *e;
   1.119  
   1.120 -	count = importer->files.size / sizeof (char *);
   1.121 +	count = importer->files.size / sizeof (struct import_entry);
   1.122  	qsort_with_data(importer->files.data,
   1.123  			count,
   1.124 -			sizeof (char *),
   1.125 +			sizeof (struct import_entry),
   1.126  			compare_filenames,
   1.127  			NULL);
   1.128  
   1.129  	root.name = razor_importer_tokenize(importer, "");
   1.130  	array_init(&root.files);
   1.131 +	array_init(&root.packages);
   1.132  	root.last = NULL;
   1.133  
   1.134  	filenames = importer->files.data;
   1.135  	for (i = 0; i < count; i++) {
   1.136 -		f = filenames[i];
   1.137 +		f = filenames[i].name;
   1.138  		if (*f != '/')
   1.139  			continue;
   1.140  
   1.141 @@ -794,12 +810,15 @@
   1.142  				d->last->name = name;
   1.143  				d->last->last = NULL;
   1.144  				array_init(&d->last->files);
   1.145 +				array_init(&d->last->packages);
   1.146  			}
   1.147  			d = d->last;				
   1.148  			f = end;
   1.149  		}
   1.150  
   1.151 -		free(filenames[i]);
   1.152 +		r = array_add(&d->packages, sizeof *r);
   1.153 +		*r = filenames[i].package;
   1.154 +		free(filenames[i].name);
   1.155  	}
   1.156  
   1.157  	count_entries(&root);
   1.158 @@ -810,7 +829,7 @@
   1.159  	e->count = root.files.size / sizeof *d;
   1.160  	e->start = 1;
   1.161  
   1.162 -	serialize_files(&root, &importer->set->file_tree);
   1.163 +	serialize_files(importer->set, &root, &importer->set->file_tree);
   1.164  
   1.165  	array_release(&importer->files);
   1.166  }
   1.167 @@ -867,6 +886,27 @@
   1.168  	list_dir(set, e, 2);
   1.169  }
   1.170  
   1.171 +void
   1.172 +razor_set_list_file_packages(struct razor_set *set, const char *filename)
   1.173 +{
   1.174 +	struct razor_entry *e;
   1.175 +	struct razor_package *packages, *p;
   1.176 +	const char *pool;
   1.177 +	unsigned long *r;
   1.178 +
   1.179 +	e = find_entry(set, set->file_tree.data, filename);
   1.180 +	if (e == NULL)
   1.181 +		return;
   1.182 +	
   1.183 +	r = (unsigned long *) set->package_pool.data + e->packages;
   1.184 +	packages = set->packages.data;
   1.185 +	pool = set->string_pool.data;
   1.186 +	while (~*r) {
   1.187 +		p = &packages[*r++];
   1.188 +		printf("%s %s\n", &pool[p->name], &pool[p->version]);
   1.189 +	}
   1.190 +}
   1.191 +
   1.192  struct razor_set *
   1.193  razor_importer_finish(struct razor_importer *importer)
   1.194  {
   1.195 @@ -892,12 +932,11 @@
   1.196  	rmap = malloc(count * sizeof *rmap);
   1.197  	for (i = 0; i < count; i++)
   1.198  		rmap[map[i]] = i;
   1.199 -
   1.200 -	remap_links(&importer->set->package_pool, rmap);
   1.201  	free(map);
   1.202 -	free(rmap);
   1.203  
   1.204  	build_file_tree(importer);
   1.205 +	remap_links(&importer->set->package_pool, rmap);
   1.206 +	free(rmap);
   1.207  
   1.208  	set = importer->set;
   1.209  	array_release(&importer->buckets);