parent
4518aa1217
commit
98b5b625ab
|
@ -41,45 +41,10 @@ void _eet_memfile_read_close(FILE *f);
|
||||||
FILE *_eet_memfile_write_open(void **data, size_t *size);
|
FILE *_eet_memfile_write_open(void **data, size_t *size);
|
||||||
void _eet_memfile_write_close(FILE *f);
|
void _eet_memfile_write_close(FILE *f);
|
||||||
void _eet_memfile_shutdown(void);
|
void _eet_memfile_shutdown(void);
|
||||||
|
int _eet_hash_gen(const char *key, int hash_size);
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
#define PATH_MAX 4096
|
#define PATH_MAX 4096
|
||||||
#endif
|
#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
|
#endif
|
||||||
|
|
|
@ -17,6 +17,7 @@ eet_lib.c \
|
||||||
eet_data.c \
|
eet_data.c \
|
||||||
eet_image.c \
|
eet_image.c \
|
||||||
eet_memfile.c \
|
eet_memfile.c \
|
||||||
|
eet_utils.c \
|
||||||
Eet_private.h
|
Eet_private.h
|
||||||
|
|
||||||
libeet_la_LIBADD = -lz -ljpeg @fnmatch_libs@ @winsock_libs@
|
libeet_la_LIBADD = -lz -ljpeg @fnmatch_libs@ @winsock_libs@
|
||||||
|
|
|
@ -610,7 +610,7 @@ _eet_descriptor_hash_new(Eet_Data_Descriptor *edd)
|
||||||
int hash;
|
int hash;
|
||||||
|
|
||||||
ede = &(edd->elements.set[i]);
|
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)
|
if (!edd->elements.hash.buckets[hash].element)
|
||||||
edd->elements.hash.buckets[hash].element = ede;
|
edd->elements.hash.buckets[hash].element = ede;
|
||||||
else
|
else
|
||||||
|
@ -651,7 +651,7 @@ _eet_descriptor_hash_find(Eet_Data_Descriptor *edd, char *name)
|
||||||
int hash;
|
int hash;
|
||||||
Eet_Data_Descriptor_Hash *bucket;
|
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 (!edd->elements.hash.buckets[hash].element) return NULL;
|
||||||
if (!strcmp(edd->elements.hash.buckets[hash].element->name, name))
|
if (!strcmp(edd->elements.hash.buckets[hash].element->name, name))
|
||||||
return edd->elements.hash.buckets[hash].element;
|
return edd->elements.hash.buckets[hash].element;
|
||||||
|
|
|
@ -701,7 +701,7 @@ eet_open(const char *file, Eet_File_Mode mode)
|
||||||
efn->name = (char*)((uint8_t*)(p + HEADER_SIZE));
|
efn->name = (char*)((uint8_t*)(p + HEADER_SIZE));
|
||||||
|
|
||||||
/* get hash bucket it should go in */
|
/* 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];
|
efn->next = ef->header->directory->nodes[hash];
|
||||||
ef->header->directory->nodes[hash] = efn;
|
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 */
|
/* 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;
|
data_size = compress ? 12 + ((size * 101) / 100) : size;
|
||||||
|
|
||||||
|
@ -1124,7 +1124,7 @@ eet_delete(Eet_File *ef, const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* figure hash bucket */
|
/* 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? */
|
/* Does this node already exist? */
|
||||||
for (pefn = NULL, efn = ef->header->directory->nodes[hash];
|
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;
|
int hash;
|
||||||
|
|
||||||
/* get hash bucket this should be in */
|
/* 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)
|
for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue