Move hash gen func to own file.

SVN revision: 27605
This commit is contained in:
Sebastian Dransfeld 2006-12-28 15:23:47 +00:00
parent 4518aa1217
commit 98b5b625ab
5 changed files with 43 additions and 42 deletions

View File

@ -41,45 +41,10 @@ void _eet_memfile_read_close(FILE *f);
FILE *_eet_memfile_write_open(void **data, size_t *size);
void _eet_memfile_write_close(FILE *f);
void _eet_memfile_shutdown(void);
int _eet_hash_gen(const char *key, int hash_size);
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
/* caluclate hash table entry valu with bitmask size of hash_size */
static int
eet_hash_gen(const char *key, int hash_size)
{
int hash_num = 0;
int value, i;
unsigned char *ptr;
const int masks[9] =
{
0x00,
0x01,
0x03,
0x07,
0x0f,
0x1f,
0x3f,
0x7f,
0xff
};
/* no string - index 0 */
if (!key) return 0;
/* calc hash num */
for (i = 0, ptr = (unsigned char *)key, value = (int)(*ptr);
value;
ptr++, i++, value = (int)(*ptr))
hash_num ^= (value | (value << 8)) >> (i & 0x7);
/* mask it */
hash_num &= masks[hash_size];
/* return it */
return hash_num;
}
#endif

View File

@ -17,6 +17,7 @@ eet_lib.c \
eet_data.c \
eet_image.c \
eet_memfile.c \
eet_utils.c \
Eet_private.h
libeet_la_LIBADD = -lz -ljpeg @fnmatch_libs@ @winsock_libs@

View File

@ -610,7 +610,7 @@ _eet_descriptor_hash_new(Eet_Data_Descriptor *edd)
int hash;
ede = &(edd->elements.set[i]);
hash = eet_hash_gen((char *) ede->name, 6);
hash = _eet_hash_gen((char *) ede->name, 6);
if (!edd->elements.hash.buckets[hash].element)
edd->elements.hash.buckets[hash].element = ede;
else
@ -651,7 +651,7 @@ _eet_descriptor_hash_find(Eet_Data_Descriptor *edd, char *name)
int hash;
Eet_Data_Descriptor_Hash *bucket;
hash = eet_hash_gen(name, 6);
hash = _eet_hash_gen(name, 6);
if (!edd->elements.hash.buckets[hash].element) return NULL;
if (!strcmp(edd->elements.hash.buckets[hash].element->name, name))
return edd->elements.hash.buckets[hash].element;

View File

@ -701,7 +701,7 @@ eet_open(const char *file, Eet_File_Mode mode)
efn->name = (char*)((uint8_t*)(p + HEADER_SIZE));
/* get hash bucket it should go in */
hash = eet_hash_gen(efn->name, ef->header->directory->size);
hash = _eet_hash_gen(efn->name, ef->header->directory->size);
efn->next = ef->header->directory->nodes[hash];
ef->header->directory->nodes[hash] = efn;
@ -1020,7 +1020,7 @@ eet_write(Eet_File *ef, const char *name, const void *data, int size, int compre
}
/* figure hash bucket */
hash = eet_hash_gen(name, ef->header->directory->size);
hash = _eet_hash_gen(name, ef->header->directory->size);
data_size = compress ? 12 + ((size * 101) / 100) : size;
@ -1124,7 +1124,7 @@ eet_delete(Eet_File *ef, const char *name)
return 0;
/* figure hash bucket */
hash = eet_hash_gen(name, ef->header->directory->size);
hash = _eet_hash_gen(name, ef->header->directory->size);
/* Does this node already exist? */
for (pefn = NULL, efn = ef->header->directory->nodes[hash];
@ -1252,7 +1252,7 @@ find_node_by_name(Eet_File *ef, const char *name)
int hash;
/* get hash bucket this should be in */
hash = eet_hash_gen(name, ef->header->directory->size);
hash = _eet_hash_gen(name, ef->header->directory->size);
for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next)
{

View File

@ -0,0 +1,35 @@
int
_eet_hash_gen(const char *key, int hash_size)
{
int hash_num = 0;
int value, i;
unsigned char *ptr;
const int masks[9] =
{
0x00,
0x01,
0x03,
0x07,
0x0f,
0x1f,
0x3f,
0x7f,
0xff
};
/* no string - index 0 */
if (!key) return 0;
/* calc hash num */
for (i = 0, ptr = (unsigned char *)key, value = (int)(*ptr);
value;
ptr++, i++, value = (int)(*ptr))
hash_num ^= (value | (value << 8)) >> (i & 0x7);
/* mask it */
hash_num &= masks[hash_size];
/* return it */
return hash_num;
}