Split out hashtable functionality from importer.
authorKristian H?gsberg <krh@redhat.com>
Sun Nov 11 14:57:42 2007 -0500 (2007-11-11)
changeset 7889c06e68824a
parent 77 3d14834c56ea
child 79 9f302fa29d83
Split out hashtable functionality from importer.
razor.c
     1.1 --- a/razor.c	Thu Nov 08 22:45:27 2007 -0500
     1.2 +++ b/razor.c	Sun Nov 11 14:57:42 2007 -0500
     1.3 @@ -89,9 +89,14 @@
     1.4  	struct import_directory *last;
     1.5  };
     1.6  
     1.7 +struct hashtable {
     1.8 +	struct array buckets;
     1.9 +	struct array *pool;
    1.10 +};
    1.11 +
    1.12  struct razor_importer {
    1.13  	struct razor_set *set;
    1.14 -	struct array buckets;
    1.15 +	struct hashtable table;
    1.16  	struct razor_package *package;
    1.17  	struct array properties;
    1.18  	struct array files;
    1.19 @@ -294,18 +299,18 @@
    1.20  }
    1.21  
    1.22  static unsigned long
    1.23 -razor_importer_lookup(struct razor_importer *importer, const char *key)
    1.24 +hashtable_lookup(struct hashtable *table, const char *key)
    1.25  {
    1.26  	unsigned int mask, start, i;
    1.27  	unsigned long *b;
    1.28  	char *pool;
    1.29  
    1.30 -	pool = importer->set->string_pool.data;
    1.31 -	mask = importer->buckets.alloc - 1;
    1.32 +	pool = table->pool->data;
    1.33 +	mask = table->buckets.alloc - 1;
    1.34  	start = hash_string(key) * sizeof(unsigned long);
    1.35  
    1.36 -	for (i = 0; i < importer->buckets.alloc; i += sizeof *b) {
    1.37 -		b = importer->buckets.data + ((start + i) & mask);
    1.38 +	for (i = 0; i < table->buckets.alloc; i += sizeof *b) {
    1.39 +		b = table->buckets.data + ((start + i) & mask);
    1.40  
    1.41  		if (*b == 0)
    1.42  			return 0;
    1.43 @@ -318,16 +323,16 @@
    1.44  }
    1.45  
    1.46  static unsigned long
    1.47 -add_to_string_pool(struct razor_set *set, const char *key)
    1.48 +add_to_string_pool(struct hashtable *table, const char *key)
    1.49  {
    1.50  	int len;
    1.51  	char *p;
    1.52  
    1.53  	len = strlen(key) + 1;
    1.54 -	p = array_add(&set->string_pool, len);
    1.55 +	p = array_add(table->pool, len);
    1.56  	memcpy(p, key, len);
    1.57  
    1.58 -	return p - (char *) set->string_pool.data;
    1.59 +	return p - (char *) table->pool->data;
    1.60  }
    1.61  
    1.62  static unsigned long
    1.63 @@ -343,18 +348,18 @@
    1.64  }
    1.65  
    1.66  static void
    1.67 -do_insert(struct razor_importer *importer, unsigned long value)
    1.68 +do_insert(struct hashtable *table, unsigned long value)
    1.69  {
    1.70  	unsigned int mask, start, i;
    1.71  	unsigned long *b;
    1.72  	const char *key;
    1.73  
    1.74 -	key = (char *) importer->set->string_pool.data + value;
    1.75 -	mask = importer->buckets.alloc - 1;
    1.76 +	key = (char *) table->pool->data + value;
    1.77 +	mask = table->buckets.alloc - 1;
    1.78  	start = hash_string(key) * sizeof(unsigned long);
    1.79  
    1.80 -	for (i = 0; i < importer->buckets.alloc; i += sizeof *b) {
    1.81 -		b = importer->buckets.data + ((start + i) & mask);
    1.82 +	for (i = 0; i < table->buckets.alloc; i += sizeof *b) {
    1.83 +		b = table->buckets.data + ((start + i) & mask);
    1.84  		if (*b == 0) {
    1.85  			*b = value;
    1.86  			break;
    1.87 @@ -363,44 +368,57 @@
    1.88  }
    1.89  
    1.90  static unsigned long
    1.91 -razor_importer_insert(struct razor_importer *importer, const char *key)
    1.92 +hashtable_insert(struct hashtable *table, const char *key)
    1.93  {
    1.94  	unsigned long value, *buckets, *b, *end;
    1.95  	int alloc;
    1.96  
    1.97 -	alloc = importer->buckets.alloc;
    1.98 -	array_add(&importer->buckets, 4 * sizeof *buckets);
    1.99 -	if (alloc != importer->buckets.alloc) {
   1.100 -		end = importer->buckets.data + alloc;
   1.101 -		memset(end, 0, importer->buckets.alloc - alloc);
   1.102 -		for (b = importer->buckets.data; b < end; b++) {
   1.103 +	alloc = table->buckets.alloc;
   1.104 +	array_add(&table->buckets, 4 * sizeof *buckets);
   1.105 +	if (alloc != table->buckets.alloc) {
   1.106 +		end = table->buckets.data + alloc;
   1.107 +		memset(end, 0, table->buckets.alloc - alloc);
   1.108 +		for (b = table->buckets.data; b < end; b++) {
   1.109  			value = *b;
   1.110  			if (value != 0) {
   1.111  				*b = 0;
   1.112 -				do_insert(importer, value);
   1.113 +				do_insert(table, value);
   1.114  			}
   1.115  		}
   1.116  	}
   1.117  
   1.118 -	value = add_to_string_pool(importer->set, key);
   1.119 -	do_insert (importer, value);
   1.120 +	value = add_to_string_pool(table, key);
   1.121 +	do_insert (table, value);
   1.122  
   1.123  	return value;
   1.124  }
   1.125  
   1.126 +static void
   1.127 +hashtable_init(struct hashtable *table, struct array *pool)
   1.128 +{
   1.129 +	array_init(&table->buckets);
   1.130 +	table->pool = pool;
   1.131 +}
   1.132 +
   1.133 +static void
   1.134 +hashtable_release(struct hashtable *table)
   1.135 +{
   1.136 +	array_release(&table->buckets);
   1.137 +}
   1.138 +
   1.139  static unsigned long
   1.140  razor_importer_tokenize(struct razor_importer *importer, const char *string)
   1.141  {
   1.142  	unsigned long token;
   1.143  
   1.144  	if (string == NULL)
   1.145 -		return razor_importer_tokenize(importer, "");
   1.146 +		string = "";
   1.147  
   1.148 -	token = razor_importer_lookup(importer, string);
   1.149 +	token = hashtable_lookup(&importer->table, string);
   1.150  	if (token != 0)
   1.151  		return token;
   1.152  
   1.153 -	return razor_importer_insert(importer, string);
   1.154 +	return hashtable_insert(&importer->table, string);
   1.155  }
   1.156  
   1.157  void
   1.158 @@ -466,6 +484,7 @@
   1.159  
   1.160  	importer = zalloc(sizeof *importer);
   1.161  	importer->set = razor_set_create();
   1.162 +	hashtable_init(&importer->table, &importer->set->string_pool);
   1.163  
   1.164  	return importer;
   1.165  }
   1.166 @@ -923,7 +942,7 @@
   1.167  	free(rmap);
   1.168  
   1.169  	set = importer->set;
   1.170 -	array_release(&importer->buckets);
   1.171 +	hashtable_release(&importer->table);
   1.172  	free(importer);
   1.173  
   1.174  	return set;
   1.175 @@ -1614,7 +1633,7 @@
   1.176  	rebuild_package_lists(importer->set);
   1.177  
   1.178  	result = importer->set;
   1.179 -	array_release(&importer->buckets);
   1.180 +	hashtable_release(&importer->table);
   1.181  	free(importer);
   1.182  
   1.183  	return result;