1.1 --- a/razor.c Thu Nov 08 17:14:19 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;