e576bb | 2002-10-11 | Martin Nilsson | |
|
aedfb1 | 2002-10-09 | Martin Nilsson | |
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "hashtable.h"
#include "stralloc.h"
#include "stuff.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | static size_t gobble(struct pike_string *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | size_t i;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | i=my_hash_string(s);
i+=i >> 3;
i+=i >> 7;
i+=i >> 12;
return i;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct hash_entry *hash_lookup(struct hash_table *h, struct pike_string *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct hash_entry *e, **prev, **base;
if(!h) return 0;
base = prev = h->htable + (gobble(s) & h->mask);
for( ;(e = *prev); prev= &e->next)
{
if(s == e->s)
{
*prev = e->next;
e->next = *base;
*base = e;
return e;
}
}
return 0;
}
static void rehash_list_backwards(struct hash_table *h,
struct hash_entry *n)
{
struct hash_entry **base;
if(!n) return;
rehash_list_backwards(h,n->next);
base=h->htable + (gobble(n->s) & h->mask);
n->next = *base;
*base=n;
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | struct hash_table *create_hash_table(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct hash_table *new;
|
dc8d02 | 2014-04-27 | Martin Nilsson | | new=calloc(1, sizeof(struct hash_table)+
(NEW_HASHTABLE_SIZE-1)*sizeof(struct hash_entry *));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | new->entries=0;
new->mask=NEW_HASHTABLE_SIZE-1;
return new;
}
struct hash_table *hash_rehash(struct hash_table *h,int size)
{
struct hash_table *new;
int e;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
112104 | 2011-05-17 | Henrik Grubbström (Grubba) | | if (size & (size-1))
Pike_fatal("Size is not a power of two! Size: 0x%08x\n", size);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
dc8d02 | 2014-04-27 | Martin Nilsson | | new=calloc(1, sizeof(struct hash_table)+
(size-1)*sizeof(struct hash_entry *));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | new->mask = size - 1;
new->entries = h->entries;
for(e=0; e<=h->mask; e++)
rehash_list_backwards(new,h->htable[e]);
|
0ec752 | 2014-04-27 | Martin Nilsson | | free(h);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return new;
}
struct hash_table *hash_insert(struct hash_table *h, struct hash_entry *s)
{
struct hash_entry **base;
if(!h) h=create_hash_table();
if(h->entries > AVERAGE_HASH_LENGTH * 2 * h->mask)
h=hash_rehash(h,(h->mask+1) * 2);
base = h->htable + (gobble(s->s) & h->mask);
s->next = *base;
*base = s;
h->entries++;
return h;
}
struct hash_table *hash_unlink(struct hash_table *h, struct hash_entry *s)
{
struct hash_entry **prev,*e;
prev = h->htable + (gobble(s->s) & h->mask);
for(;( e=*prev ); prev=&e->next)
{
if(e==s)
{
*prev = e->next;
h->entries--;
if(h->mask > NEW_HASHTABLE_SIZE &&
h->entries < AVERAGE_HASH_LENGTH / 2 * h->mask)
h=hash_rehash(h,(h->mask+1) / 2);
return h;
}
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hash_entry not in hashtable\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
return h;
}
void map_hashtable(struct hash_table *h, void (*fun)(struct hash_entry *))
{
INT32 e;
struct hash_entry *i, *n;
for(e=0;e<=h->mask;e++)
{
for(i=h->htable[e];i;i=n)
{
n=i->next;
fun(i);
}
}
}
void free_hashtable(struct hash_table *h,
void (*free_entry)(struct hash_entry *))
{
INT32 e;
struct hash_entry *i, *n;
for(e=0;e<=h->mask;e++)
{
for(i=h->htable[e];i;i=n)
{
n=i->next;
free_string(i->s);
if(free_entry)
free_entry(i);
else
|
0ec752 | 2014-04-27 | Martin Nilsson | | free(i);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
0ec752 | 2014-04-27 | Martin Nilsson | | free(h);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|