forked from enlightenment/efl
parent
0cb884cab6
commit
8176b2c5fa
|
@ -80,6 +80,8 @@ static void eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num,
|
|||
static int eet_string_match(char *s1, char *s2);
|
||||
static int eet_hash_gen(char *key, int hash_size);
|
||||
static void eet_flush(Eet_File *ef);
|
||||
static Eet_File_Node *find_node_by_name (Eet_File *ef, char *name);
|
||||
static int read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len);
|
||||
|
||||
/* cache. i don't expect this to ever be large, so arrays will do */
|
||||
static int eet_writers_num = 0;
|
||||
|
@ -784,61 +786,44 @@ eet_read(Eet_File *ef, char *name, int *size_ret)
|
|||
{
|
||||
void *data = NULL;
|
||||
int size = 0;
|
||||
int hash;
|
||||
Eet_File_Node *efn;
|
||||
|
||||
if (size_ret) *size_ret = 0;
|
||||
|
||||
/* check to see its' an eet file pointer */
|
||||
if ((!ef) || (ef->magic != EET_MAGIC_FILE) || (!name) ||
|
||||
((ef->mode != EET_FILE_MODE_READ) &&
|
||||
(ef->mode != EET_FILE_MODE_READ_WRITE)))
|
||||
{
|
||||
if (size_ret) *size_ret = 0;
|
||||
return NULL;
|
||||
}
|
||||
/* no header, return NULL */
|
||||
if (!ef->header) return NULL;
|
||||
/* no directory, return NULL */
|
||||
if (!ef->header->directory) return NULL;
|
||||
/* get hash bucket this should be in */
|
||||
hash = eet_hash_gen(name, ef->header->directory->size);
|
||||
|
||||
/* hunt hash bucket */
|
||||
for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next)
|
||||
{
|
||||
/* if it matches */
|
||||
if (eet_string_match(efn->name, name))
|
||||
{
|
||||
/* uncompressed data */
|
||||
if (efn->compression == 0)
|
||||
{
|
||||
/* get size */
|
||||
size = efn->size;
|
||||
efn = find_node_by_name(ef, name);
|
||||
if (!efn) return NULL;
|
||||
|
||||
/* get size (uncompressed, if compressed at all) */
|
||||
size = efn->data_size;
|
||||
|
||||
/* allocate data */
|
||||
data = malloc(size);
|
||||
if (data)
|
||||
if (!data) return NULL;
|
||||
|
||||
/* uncompressed data */
|
||||
if (efn->compression == 0)
|
||||
{
|
||||
/* if we alreayd have the data in ram... copy that */
|
||||
if (efn->data)
|
||||
memcpy(data, efn->data, efn->size);
|
||||
/* or get data from disk */
|
||||
else
|
||||
{
|
||||
/* seek to data location */
|
||||
if (fseek(ef->fp, efn->offset, SEEK_SET) < 0)
|
||||
else if (!read_data_from_disk(ef, efn, data, size))
|
||||
{
|
||||
free(data);
|
||||
data = NULL;
|
||||
break;
|
||||
return NULL;
|
||||
}
|
||||
/* read it */
|
||||
if (fread(data, size, 1, ef->fp) != 1)
|
||||
{
|
||||
free(data);
|
||||
data = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* compressed data */
|
||||
else
|
||||
|
@ -847,12 +832,6 @@ eet_read(Eet_File *ef, char *name, int *size_ret)
|
|||
int free_tmp = 0, compr_size = efn->size;
|
||||
uLongf dlen;
|
||||
|
||||
/* get size uncompressed */
|
||||
size = efn->data_size;
|
||||
/* allocate data */
|
||||
data = malloc(size);
|
||||
if (!data) break;
|
||||
|
||||
/* if we already have the data in ram... copy that */
|
||||
if (efn->data)
|
||||
tmp_data = efn->data;
|
||||
|
@ -862,28 +841,15 @@ eet_read(Eet_File *ef, char *name, int *size_ret)
|
|||
if (!tmp_data)
|
||||
{
|
||||
free(data);
|
||||
data = NULL;
|
||||
break;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free_tmp = 1;
|
||||
|
||||
/* get data from disk */
|
||||
/* seek to data location */
|
||||
if (fseek(ef->fp, efn->offset, SEEK_SET) < 0)
|
||||
if (!read_data_from_disk(ef, efn, tmp_data, compr_size))
|
||||
{
|
||||
free(tmp_data);
|
||||
free(data);
|
||||
data = NULL;
|
||||
break;
|
||||
}
|
||||
/* read it */
|
||||
if (fread(tmp_data, compr_size, 1, ef->fp) != 1)
|
||||
{
|
||||
free(tmp_data);
|
||||
free(data);
|
||||
data = NULL;
|
||||
break;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -893,14 +859,12 @@ eet_read(Eet_File *ef, char *name, int *size_ret)
|
|||
tmp_data, (uLongf)compr_size))
|
||||
{
|
||||
free(data);
|
||||
data = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (free_tmp) free(tmp_data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* fill in return values */
|
||||
if (size_ret) *size_ret = size;
|
||||
return data;
|
||||
|
@ -1147,3 +1111,28 @@ eet_num_entries(Eet_File *ef)
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static Eet_File_Node *
|
||||
find_node_by_name(Eet_File *ef, char *name)
|
||||
{
|
||||
Eet_File_Node *efn;
|
||||
int hash;
|
||||
|
||||
/* get hash bucket this should be in */
|
||||
hash = eet_hash_gen(name, ef->header->directory->size);
|
||||
|
||||
for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next)
|
||||
if (eet_string_match(efn->name, name)) return efn;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len)
|
||||
{
|
||||
/* seek to data location */
|
||||
if (fseek(ef->fp, efn->offset, SEEK_SET) < 0) return 0;
|
||||
|
||||
/* read it */
|
||||
return (fread(buf, len, 1, ef->fp) == 1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue