forked from enlightenment/efl
parent
a68c953591
commit
b336298727
|
@ -219,6 +219,13 @@ static void *eet_data_put_null(Eet_Dictionary *ed, const void *src, int *size_re
|
||||||
static int eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest);
|
static int eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest);
|
||||||
static void *eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret);
|
static void *eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret);
|
||||||
|
|
||||||
|
static void eet_data_dump_group_start(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, int group_type, const char *name);
|
||||||
|
static void eet_data_dump_group_end(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata);
|
||||||
|
static void eet_data_dump_level(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata);
|
||||||
|
static void eet_data_dump_simple_type(int type, const char *name, void *dd,
|
||||||
|
int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata);
|
||||||
|
|
||||||
|
|
||||||
static int eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
|
static int eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
|
||||||
static void eet_data_put_unknown(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
|
static void eet_data_put_unknown(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
|
||||||
static void eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
|
static void eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
|
||||||
|
@ -732,31 +739,17 @@ eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk,
|
||||||
const char *s;
|
const char *s;
|
||||||
int ret1, ret2;
|
int ret1, ret2;
|
||||||
|
|
||||||
if (!src)
|
if (!src) return;
|
||||||
{
|
if (size <= 8) return;
|
||||||
fprintf(stderr, "stiouf -3\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (size <= 8)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "stiouf -2 %i\n", size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!chnk)
|
if (!chnk) return;
|
||||||
{
|
|
||||||
fprintf(stderr, "stiouf -1\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
s = src;
|
s = src;
|
||||||
if (s[2] == 'K')
|
if (s[2] == 'K')
|
||||||
{
|
{
|
||||||
if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'K'))
|
if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'K'))
|
||||||
{
|
|
||||||
fprintf(stderr, "stiouf 0\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
chnk->type = (unsigned char)(s[3]);
|
chnk->type = (unsigned char)(s[3]);
|
||||||
if (chnk->type > EET_T_LAST)
|
if (chnk->type > EET_T_LAST)
|
||||||
{
|
{
|
||||||
|
@ -775,28 +768,13 @@ eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K'))
|
if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K'))
|
||||||
{
|
|
||||||
fprintf(stderr, "stiouf 1\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ret1 = eet_data_get_type(ed, EET_T_INT, (s + 4), (s + size), &(chnk->size));
|
ret1 = eet_data_get_type(ed, EET_T_INT, (s + 4), (s + size), &(chnk->size));
|
||||||
if (ret1 <= 0)
|
if (ret1 <= 0) return;
|
||||||
{
|
if ((chnk->size < 0) || ((chnk->size + 8) > size)) return;
|
||||||
fprintf(stderr, "stiouf 2\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((chnk->size < 0) || ((chnk->size + 8) > size))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "stiouf 3\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ret2 = eet_data_get_type(ed, EET_T_STRING, (s + 8), (s + size), &(chnk->name));
|
ret2 = eet_data_get_type(ed, EET_T_STRING, (s + 8), (s + size), &(chnk->name));
|
||||||
if (ret2 <= 0)
|
if (ret2 <= 0) return;
|
||||||
{
|
|
||||||
fprintf(stderr, "stiouf 4\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
chnk->len = ret2;
|
chnk->len = ret2;
|
||||||
|
|
||||||
|
@ -2199,7 +2177,7 @@ _eet_data_descriptor_decode(Eet_Free_Context *context,
|
||||||
void *dumpdata)
|
void *dumpdata)
|
||||||
{
|
{
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
char *p, tbuf[256];
|
char *p;
|
||||||
int size, i, dump;
|
int size, i, dump;
|
||||||
int chnk_type;
|
int chnk_type;
|
||||||
Eet_Data_Chunk chnk;
|
Eet_Data_Chunk chnk;
|
||||||
|
@ -2247,23 +2225,15 @@ _eet_data_descriptor_decode(Eet_Free_Context *context,
|
||||||
{
|
{
|
||||||
dump = 1;
|
dump = 1;
|
||||||
if (chnk.type == EET_T_UNKNOW)
|
if (chnk.type == EET_T_UNKNOW)
|
||||||
{
|
eet_data_dump_group_start(level, dumpfunc, dumpdata, chnk.group_type, chnk.name);
|
||||||
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
|
||||||
dumpfunc(dumpdata, "group \"");
|
|
||||||
_eet_data_dump_string_escape(dumpdata, dumpfunc, chnk.name);
|
|
||||||
dumpfunc(dumpdata, "\" ");
|
|
||||||
|
|
||||||
chnk_type = (chnk.group_type >= EET_G_UNKNOWN && chnk.group_type <= EET_G_HASH) ?
|
|
||||||
chnk.group_type : EET_G_LAST;
|
|
||||||
|
|
||||||
dumpfunc(dumpdata, _dump_g_name[chnk_type - EET_G_UNKNOWN]);
|
|
||||||
dumpfunc(dumpdata, " {\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
while (size > 0)
|
while (size > 0)
|
||||||
{
|
{
|
||||||
Eet_Data_Chunk echnk;
|
Eet_Data_Chunk echnk;
|
||||||
Eet_Data_Element *ede;
|
Eet_Data_Element *ede = NULL;
|
||||||
|
unsigned char dd[128];
|
||||||
|
int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/* get next data chunk */
|
/* get next data chunk */
|
||||||
memset(&echnk, 0, sizeof(Eet_Data_Chunk));
|
memset(&echnk, 0, sizeof(Eet_Data_Chunk));
|
||||||
|
@ -2275,9 +2245,6 @@ _eet_data_descriptor_decode(Eet_Free_Context *context,
|
||||||
ede = _eet_descriptor_hash_find(edd, echnk.name, echnk.hash);
|
ede = _eet_descriptor_hash_find(edd, echnk.name, echnk.hash);
|
||||||
if (ede)
|
if (ede)
|
||||||
{
|
{
|
||||||
int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
group_type = ede->group_type;
|
group_type = ede->group_type;
|
||||||
type = ede->type;
|
type = ede->type;
|
||||||
if ((echnk.type == 0) && (echnk.group_type == 0))
|
if ((echnk.type == 0) && (echnk.group_type == 0))
|
||||||
|
@ -2295,32 +2262,21 @@ _eet_data_descriptor_decode(Eet_Free_Context *context,
|
||||||
(echnk.group_type == ede->group_type))
|
(echnk.group_type == ede->group_type))
|
||||||
group_type = echnk.group_type;
|
group_type = echnk.group_type;
|
||||||
}
|
}
|
||||||
/* hashes doesnt fit well with the table */
|
|
||||||
ret = eet_group_codec[group_type - 100].get(context, ed, edd, ede, &echnk, type, group_type, ((char *)data) + ede->offset, level, dumpfunc, dumpdata, &p, &size);
|
|
||||||
if (ret <= 0) goto error;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*...... dump func */
|
/*...... dump func */
|
||||||
else if (dumpfunc)
|
else if (dumpfunc)
|
||||||
{
|
{
|
||||||
unsigned char dd[128];
|
|
||||||
int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW;
|
|
||||||
|
|
||||||
if ((echnk.type > EET_T_UNKNOW) &&
|
if ((echnk.type > EET_T_UNKNOW) &&
|
||||||
(echnk.type < EET_T_LAST))
|
(echnk.type < EET_T_LAST))
|
||||||
type = echnk.type;
|
type = echnk.type;
|
||||||
else if ((echnk.group_type > EET_G_UNKNOWN) &&
|
else if ((echnk.group_type > EET_G_UNKNOWN) &&
|
||||||
(echnk.group_type < EET_G_LAST))
|
(echnk.group_type < EET_G_LAST))
|
||||||
group_type = echnk.group_type;
|
group_type = echnk.group_type;
|
||||||
if (group_type == EET_G_UNKNOWN)
|
}
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
void *data_ret;
|
|
||||||
|
|
||||||
if (IS_SIMPLE_TYPE(type))
|
if (dumpfunc && group_type == EET_G_UNKNOWN && IS_SIMPLE_TYPE(type))
|
||||||
{
|
{
|
||||||
const char *type_name = NULL;
|
|
||||||
|
|
||||||
ret = eet_data_get_type(ed,
|
ret = eet_data_get_type(ed,
|
||||||
type,
|
type,
|
||||||
echnk.data,
|
echnk.data,
|
||||||
|
@ -2328,207 +2284,16 @@ _eet_data_descriptor_decode(Eet_Free_Context *context,
|
||||||
dd);
|
dd);
|
||||||
if (ret <= 0) goto error;
|
if (ret <= 0) goto error;
|
||||||
|
|
||||||
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
eet_data_dump_simple_type(type, echnk.name, dd, level, dumpfunc, dumpdata);
|
||||||
dumpfunc(dumpdata, " value \"");
|
|
||||||
_eet_data_dump_string_escape(dumpdata, dumpfunc, echnk.name);
|
|
||||||
dumpfunc(dumpdata, "\" ");
|
|
||||||
|
|
||||||
#define EET_T_TYPE(Eet_Type, Type) \
|
|
||||||
case Eet_Type: \
|
|
||||||
{ \
|
|
||||||
dumpfunc(dumpdata, _dump_t_name[Eet_Type][0]); \
|
|
||||||
snprintf(tbuf, sizeof (tbuf), _dump_t_name[Eet_Type][1], *((Type *)dd)); \
|
|
||||||
dumpfunc(dumpdata, tbuf); \
|
|
||||||
break; \
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
EET_T_TYPE(EET_T_CHAR, char);
|
|
||||||
EET_T_TYPE(EET_T_SHORT, short);
|
|
||||||
EET_T_TYPE(EET_T_INT, int);
|
|
||||||
EET_T_TYPE(EET_T_LONG_LONG, long long);
|
|
||||||
EET_T_TYPE(EET_T_FLOAT, float);
|
|
||||||
EET_T_TYPE(EET_T_DOUBLE, double);
|
|
||||||
EET_T_TYPE(EET_T_UCHAR, unsigned char);
|
|
||||||
EET_T_TYPE(EET_T_USHORT, unsigned short);
|
|
||||||
EET_T_TYPE(EET_T_UINT, unsigned int);
|
|
||||||
EET_T_TYPE(EET_T_ULONG_LONG, unsigned long long);
|
|
||||||
case EET_T_INLINED_STRING:
|
|
||||||
type_name = "inlined: \"";
|
|
||||||
case EET_T_STRING:
|
|
||||||
if (!type_name) type_name = "string: \"";
|
|
||||||
|
|
||||||
{
|
|
||||||
char *s;
|
|
||||||
|
|
||||||
s = *((char **)dd);
|
|
||||||
if (s)
|
|
||||||
{
|
|
||||||
dumpfunc(dumpdata, type_name);
|
|
||||||
_eet_data_dump_string_escape(dumpdata, dumpfunc, s);
|
|
||||||
dumpfunc(dumpdata, "\"");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EET_T_NULL:
|
|
||||||
dumpfunc(dumpdata, "null");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dumpfunc(dumpdata, "???: ???"); break;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dumpfunc(dumpdata, ";\n");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data_ret = _eet_data_descriptor_decode(context,
|
ret = eet_group_codec[group_type - 100].get(context,
|
||||||
ed,
|
ed, edd, ede, &echnk,
|
||||||
NULL,
|
type, group_type, ede ? ((char *)data) + ede->offset : dd,
|
||||||
echnk.data,
|
level, dumpfunc, dumpdata,
|
||||||
echnk.size,
|
&p, &size);
|
||||||
level + 1,
|
|
||||||
dumpfunc,
|
|
||||||
dumpdata);
|
|
||||||
if (!data_ret) goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
|
||||||
dumpfunc(dumpdata, " group \"");
|
|
||||||
_eet_data_dump_string_escape(dumpdata, dumpfunc, echnk.name);
|
|
||||||
dumpfunc(dumpdata, "\" ");
|
|
||||||
|
|
||||||
chnk_type = (echnk.group_type >= EET_G_UNKNOWN && echnk.group_type <= EET_G_HASH) ?
|
|
||||||
echnk.group_type : EET_G_LAST;
|
|
||||||
|
|
||||||
dumpfunc(dumpdata, _dump_g_name[chnk_type - EET_G_UNKNOWN]);
|
|
||||||
dumpfunc(dumpdata, " {\n");
|
|
||||||
switch (group_type)
|
|
||||||
{
|
|
||||||
case EET_G_ARRAY:
|
|
||||||
case EET_G_VAR_ARRAY:
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
int ret;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
EET_ASSERT(!IS_SIMPLE_TYPE(type), goto error);
|
|
||||||
|
|
||||||
ret = eet_data_get_type(ed,
|
|
||||||
EET_T_INT,
|
|
||||||
echnk.data,
|
|
||||||
((char *)echnk.data) + echnk.size,
|
|
||||||
&count);
|
|
||||||
if (ret <= 0) goto error;
|
if (ret <= 0) goto error;
|
||||||
|
|
||||||
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
|
||||||
dumpfunc(dumpdata, " count ");
|
|
||||||
snprintf(tbuf, sizeof(tbuf), "%i", count);
|
|
||||||
dumpfunc(dumpdata, tbuf);
|
|
||||||
dumpfunc(dumpdata, ";\n");
|
|
||||||
|
|
||||||
/* get all array elements */
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
void *data_ret = NULL;
|
|
||||||
|
|
||||||
/* Advance to next chunk */
|
|
||||||
NEXT_CHUNK(p, size, echnk, ed);
|
|
||||||
memset(&echnk, 0, sizeof(Eet_Data_Chunk));
|
|
||||||
|
|
||||||
eet_data_chunk_get(ed, &echnk, p, size);
|
|
||||||
if (!echnk.name) goto error;
|
|
||||||
/* get the data */
|
|
||||||
data_ret = _eet_data_descriptor_decode(context,
|
|
||||||
ed,
|
|
||||||
NULL,
|
|
||||||
echnk.data,
|
|
||||||
echnk.size,
|
|
||||||
level + 2,
|
|
||||||
dumpfunc,
|
|
||||||
dumpdata);
|
|
||||||
if (!data_ret) goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EET_G_LIST:
|
|
||||||
{
|
|
||||||
void *data_ret = NULL;
|
|
||||||
|
|
||||||
EET_ASSERT(!IS_SIMPLE_TYPE(type), goto error);
|
|
||||||
|
|
||||||
data_ret = _eet_data_descriptor_decode(context,
|
|
||||||
ed,
|
|
||||||
NULL,
|
|
||||||
echnk.data,
|
|
||||||
echnk.size,
|
|
||||||
level + 2,
|
|
||||||
dumpfunc,
|
|
||||||
dumpdata);
|
|
||||||
if (!data_ret) goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EET_G_HASH:
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
char *key = NULL;
|
|
||||||
void *data_ret = NULL;
|
|
||||||
|
|
||||||
/* Read key */
|
|
||||||
ret = eet_data_get_type(ed,
|
|
||||||
EET_T_STRING,
|
|
||||||
echnk.data,
|
|
||||||
((char *)echnk.data) + echnk.size,
|
|
||||||
&key);
|
|
||||||
if (ret <= 0) goto error;
|
|
||||||
|
|
||||||
/* Advance to next chunk */
|
|
||||||
NEXT_CHUNK(p, size, echnk, ed);
|
|
||||||
memset(&echnk, 0, sizeof(Eet_Data_Chunk));
|
|
||||||
|
|
||||||
/* Read value */
|
|
||||||
eet_data_chunk_get(ed, &echnk, p, size);
|
|
||||||
if (!echnk.name) goto error;
|
|
||||||
|
|
||||||
EET_ASSERT(!IS_SIMPLE_TYPE(type), goto error);
|
|
||||||
|
|
||||||
{
|
|
||||||
char *s;
|
|
||||||
|
|
||||||
s = key;
|
|
||||||
if (s)
|
|
||||||
{
|
|
||||||
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
|
||||||
dumpfunc(dumpdata, " key \"");
|
|
||||||
_eet_data_dump_string_escape(dumpdata, dumpfunc, s);
|
|
||||||
dumpfunc(dumpdata, "\";\n");
|
|
||||||
}
|
|
||||||
data_ret = _eet_data_descriptor_decode(context,
|
|
||||||
ed,
|
|
||||||
NULL,
|
|
||||||
echnk.data,
|
|
||||||
echnk.size,
|
|
||||||
level + 2,
|
|
||||||
dumpfunc,
|
|
||||||
dumpdata);
|
|
||||||
}
|
|
||||||
if (!data_ret)
|
|
||||||
{
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (dumpfunc)
|
|
||||||
{
|
|
||||||
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
|
||||||
dumpfunc(dumpdata, " }\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* advance to next chunk */
|
/* advance to next chunk */
|
||||||
NEXT_CHUNK(p, size, echnk, ed);
|
NEXT_CHUNK(p, size, echnk, ed);
|
||||||
|
@ -2588,39 +2353,91 @@ error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eet_data_dump_level(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eet_data_dump_group_start(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
|
||||||
|
int group_type, const char *name)
|
||||||
|
{
|
||||||
|
int chnk_type;
|
||||||
|
|
||||||
|
chnk_type = (group_type >= EET_G_UNKNOWN && group_type <= EET_G_HASH) ?
|
||||||
|
group_type : EET_G_LAST;
|
||||||
|
|
||||||
|
eet_data_dump_level(level, dumpfunc, dumpdata);
|
||||||
|
dumpfunc(dumpdata, "group \"");
|
||||||
|
_eet_data_dump_string_escape(dumpdata, dumpfunc, name);
|
||||||
|
dumpfunc(dumpdata, "\" ");
|
||||||
|
|
||||||
|
dumpfunc(dumpdata, _dump_g_name[chnk_type - EET_G_UNKNOWN]);
|
||||||
|
dumpfunc(dumpdata, " {\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eet_data_dump_group_end(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata)
|
||||||
|
{
|
||||||
|
eet_data_dump_level(level, dumpfunc, dumpdata);
|
||||||
|
dumpfunc(dumpdata, " }\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
eet_data_get_list(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
|
eet_data_get_list(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
|
||||||
int type __UNUSED__, int group_type __UNUSED__, void *data,
|
int type, int group_type __UNUSED__, void *data,
|
||||||
int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
|
int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
|
||||||
char **p __UNUSED__, int *size __UNUSED__)
|
char **p, int *size)
|
||||||
{
|
{
|
||||||
|
Eet_Data_Descriptor *subtype = NULL;
|
||||||
void *list = NULL;
|
void *list = NULL;
|
||||||
void **ptr;
|
void **ptr;
|
||||||
void *data_ret;
|
void *data_ret;
|
||||||
|
int et = EET_T_UNKNOW;
|
||||||
|
|
||||||
EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
|
EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
|
||||||
|
|
||||||
|
if (edd)
|
||||||
|
{
|
||||||
|
subtype = ede->subtype;
|
||||||
|
et = ede->type;
|
||||||
|
}
|
||||||
|
else if (dumpfunc)
|
||||||
|
{
|
||||||
|
eet_data_dump_group_start(level + 1, dumpfunc, dumpdata, echnk->group_type, echnk->name);
|
||||||
|
}
|
||||||
|
|
||||||
ptr = (void **)data;
|
ptr = (void **)data;
|
||||||
list = *ptr;
|
list = *ptr;
|
||||||
data_ret = NULL;
|
data_ret = NULL;
|
||||||
|
|
||||||
if (ede->type >= EET_T_STRING)
|
if (et >= EET_T_STRING)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = eet_data_get_unknown(context, ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN,
|
ret = eet_data_get_unknown(context, ed, edd, ede, echnk, et, EET_G_UNKNOWN,
|
||||||
&data_ret, level, dumpfunc, dumpdata, p, size);
|
&data_ret, level, dumpfunc, dumpdata, p, size);
|
||||||
if (!ret) return 0;
|
if (!ret) return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data_ret = _eet_data_descriptor_decode(context, ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata);
|
data_ret = _eet_data_descriptor_decode(context, ed, subtype,
|
||||||
|
echnk->data, echnk->size,
|
||||||
|
level + 2, dumpfunc, dumpdata);
|
||||||
if (!data_ret) return 0;
|
if (!data_ret) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (edd)
|
||||||
|
{
|
||||||
list = edd->func.list_append(list, data_ret);
|
list = edd->func.list_append(list, data_ret);
|
||||||
*ptr = list;
|
*ptr = list;
|
||||||
_eet_freelist_list_add(context, ptr);
|
_eet_freelist_list_add(context, ptr);
|
||||||
|
}
|
||||||
|
else if (dumpfunc)
|
||||||
|
eet_data_dump_group_end(level, dumpfunc, dumpdata);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -2658,11 +2475,21 @@ eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_
|
||||||
eet_data_chunk_get(ed, echnk, *p, *size);
|
eet_data_chunk_get(ed, echnk, *p, *size);
|
||||||
if (!echnk->name) goto on_error;
|
if (!echnk->name) goto on_error;
|
||||||
|
|
||||||
|
if (dumpfunc && key)
|
||||||
|
{
|
||||||
|
eet_data_dump_group_start(level + 1, dumpfunc, dumpdata, echnk->group_type, echnk->name);
|
||||||
|
|
||||||
|
eet_data_dump_level(level, dumpfunc, dumpdata);
|
||||||
|
dumpfunc(dumpdata, " key \"");
|
||||||
|
_eet_data_dump_string_escape(dumpdata, dumpfunc, key);
|
||||||
|
dumpfunc(dumpdata, "\";\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (type >= EET_T_STRING)
|
if (type >= EET_T_STRING)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = eet_data_get_unknown(context, ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN,
|
ret = eet_data_get_unknown(context, ed, edd, ede, echnk, ede ? ede->type : type, EET_G_UNKNOWN,
|
||||||
&data_ret, level, dumpfunc, dumpdata, p, size);
|
&data_ret, level, dumpfunc, dumpdata, p, size);
|
||||||
if (!ret) return 0;
|
if (!ret) return 0;
|
||||||
}
|
}
|
||||||
|
@ -2670,7 +2497,7 @@ eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_
|
||||||
{
|
{
|
||||||
data_ret = _eet_data_descriptor_decode(context,
|
data_ret = _eet_data_descriptor_decode(context,
|
||||||
ed,
|
ed,
|
||||||
ede->subtype,
|
ede ? ede->subtype : NULL,
|
||||||
echnk->data,
|
echnk->data,
|
||||||
echnk->size,
|
echnk->size,
|
||||||
level + 2,
|
level + 2,
|
||||||
|
@ -2679,9 +2506,15 @@ eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_
|
||||||
if (!data_ret) goto on_error;
|
if (!data_ret) goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (edd)
|
||||||
|
{
|
||||||
hash = edd->func.hash_add(hash, key, data_ret);
|
hash = edd->func.hash_add(hash, key, data_ret);
|
||||||
*ptr = hash;
|
*ptr = hash;
|
||||||
_eet_freelist_hash_add(context, ptr);
|
_eet_freelist_hash_add(context, ptr);
|
||||||
|
}
|
||||||
|
else if (dumpfunc)
|
||||||
|
eet_data_dump_group_end(level, dumpfunc, dumpdata);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
|
@ -2709,7 +2542,7 @@ eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data
|
||||||
void *ptr;
|
void *ptr;
|
||||||
int count;
|
int count;
|
||||||
int ret;
|
int ret;
|
||||||
int subsize;
|
int subsize = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
|
EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
|
||||||
|
@ -2723,13 +2556,15 @@ eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data
|
||||||
&count);
|
&count);
|
||||||
if (ret <= 0) return ret;
|
if (ret <= 0) return ret;
|
||||||
|
|
||||||
|
name = echnk->name;
|
||||||
|
|
||||||
|
if (ede)
|
||||||
|
{
|
||||||
if (type >= EET_T_STRING)
|
if (type >= EET_T_STRING)
|
||||||
subsize = eet_basic_codec[ede->type].size;
|
subsize = eet_basic_codec[ede->type].size;
|
||||||
else
|
else
|
||||||
subsize = ede->subtype->size;
|
subsize = ede->subtype->size;
|
||||||
|
|
||||||
name = echnk->name;
|
|
||||||
|
|
||||||
if (group_type == EET_G_VAR_ARRAY)
|
if (group_type == EET_G_VAR_ARRAY)
|
||||||
{
|
{
|
||||||
/* store the number of elements
|
/* store the number of elements
|
||||||
|
@ -2744,11 +2579,24 @@ eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data
|
||||||
|
|
||||||
_eet_freelist_add(context, *(void **)ptr);
|
_eet_freelist_add(context, *(void **)ptr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char tbuf[256];
|
||||||
|
|
||||||
|
eet_data_dump_group_start(level + 1, dumpfunc, dumpdata, echnk->group_type, echnk->name);
|
||||||
|
|
||||||
|
eet_data_dump_level(level, dumpfunc, dumpdata);
|
||||||
|
dumpfunc(dumpdata, " count ");
|
||||||
|
eina_convert_itoa(count, tbuf);
|
||||||
|
dumpfunc(dumpdata, tbuf);
|
||||||
|
dumpfunc(dumpdata, ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* get all array elements */
|
/* get all array elements */
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
void *dst;
|
void *dst = NULL;
|
||||||
void *data_ret = NULL;
|
void *data_ret = NULL;
|
||||||
|
|
||||||
/* Advance to next chunk */
|
/* Advance to next chunk */
|
||||||
|
@ -2760,49 +2608,103 @@ eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data
|
||||||
/* get the data */
|
/* get the data */
|
||||||
|
|
||||||
/* get the destination pointer */
|
/* get the destination pointer */
|
||||||
|
if (ede)
|
||||||
|
{
|
||||||
if (group_type == EET_G_ARRAY)
|
if (group_type == EET_G_ARRAY)
|
||||||
dst = (char *)ptr + (subsize * i);
|
dst = (char *)ptr + (subsize * i);
|
||||||
else
|
else
|
||||||
dst = *(char **)ptr + (subsize * i);
|
dst = *(char **)ptr + (subsize * i);
|
||||||
|
}
|
||||||
|
|
||||||
if (type >= EET_T_STRING)
|
if (type >= EET_T_STRING)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = eet_data_get_unknown(context,
|
ret = eet_data_get_unknown(context, ed, edd, ede, echnk, ede ? ede->type : type, EET_G_UNKNOWN,
|
||||||
ed,
|
&data_ret, level, dumpfunc, dumpdata, p, size);
|
||||||
edd,
|
|
||||||
ede,
|
|
||||||
echnk,
|
|
||||||
ede->type,
|
|
||||||
EET_G_UNKNOWN,
|
|
||||||
&data_ret,
|
|
||||||
level,
|
|
||||||
dumpfunc,
|
|
||||||
dumpdata,
|
|
||||||
p,
|
|
||||||
size);
|
|
||||||
if (!ret) return 0;
|
if (!ret) return 0;
|
||||||
memcpy(dst, &data_ret, subsize);
|
if (dst) memcpy(dst, &data_ret, subsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data_ret = _eet_data_descriptor_decode(context,
|
data_ret = _eet_data_descriptor_decode(context, ed, ede ? ede->subtype : NULL,
|
||||||
ed,
|
echnk->data, echnk->size,
|
||||||
ede->subtype,
|
level + 2, dumpfunc, dumpdata);
|
||||||
echnk->data,
|
|
||||||
echnk->size,
|
|
||||||
level + 2,
|
|
||||||
dumpfunc,
|
|
||||||
dumpdata);
|
|
||||||
if (!data_ret) return 0;
|
if (!data_ret) return 0;
|
||||||
|
if (dst)
|
||||||
|
{
|
||||||
memcpy(dst, data_ret, subsize);
|
memcpy(dst, data_ret, subsize);
|
||||||
_eet_freelist_add(context, data_ret);
|
_eet_freelist_add(context, data_ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dumpfunc)
|
||||||
|
eet_data_dump_group_end(level, dumpfunc, dumpdata);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eet_data_dump_simple_type(int type, const char *name, void *dd,
|
||||||
|
int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata)
|
||||||
|
{
|
||||||
|
const char *type_name = NULL;
|
||||||
|
char tbuf[256];
|
||||||
|
|
||||||
|
eet_data_dump_level(level, dumpfunc, dumpdata);
|
||||||
|
dumpfunc(dumpdata, " value \"");
|
||||||
|
_eet_data_dump_string_escape(dumpdata, dumpfunc, name);
|
||||||
|
dumpfunc(dumpdata, "\" ");
|
||||||
|
|
||||||
|
#define EET_T_TYPE(Eet_Type, Type) \
|
||||||
|
case Eet_Type: \
|
||||||
|
{ \
|
||||||
|
dumpfunc(dumpdata, _dump_t_name[Eet_Type][0]); \
|
||||||
|
snprintf(tbuf, sizeof (tbuf), _dump_t_name[Eet_Type][1], *((Type *)dd)); \
|
||||||
|
dumpfunc(dumpdata, tbuf); \
|
||||||
|
break; \
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
EET_T_TYPE(EET_T_CHAR, char);
|
||||||
|
EET_T_TYPE(EET_T_SHORT, short);
|
||||||
|
EET_T_TYPE(EET_T_INT, int);
|
||||||
|
EET_T_TYPE(EET_T_LONG_LONG, long long);
|
||||||
|
EET_T_TYPE(EET_T_FLOAT, float);
|
||||||
|
EET_T_TYPE(EET_T_DOUBLE, double);
|
||||||
|
EET_T_TYPE(EET_T_UCHAR, unsigned char);
|
||||||
|
EET_T_TYPE(EET_T_USHORT, unsigned short);
|
||||||
|
EET_T_TYPE(EET_T_UINT, unsigned int);
|
||||||
|
EET_T_TYPE(EET_T_ULONG_LONG, unsigned long long);
|
||||||
|
case EET_T_INLINED_STRING:
|
||||||
|
type_name = "inlined: \"";
|
||||||
|
case EET_T_STRING:
|
||||||
|
if (!type_name) type_name = "string: \"";
|
||||||
|
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
s = *((char **)dd);
|
||||||
|
if (s)
|
||||||
|
{
|
||||||
|
dumpfunc(dumpdata, type_name);
|
||||||
|
_eet_data_dump_string_escape(dumpdata, dumpfunc, s);
|
||||||
|
dumpfunc(dumpdata, "\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EET_T_NULL:
|
||||||
|
dumpfunc(dumpdata, "null");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dumpfunc(dumpdata, "???: ???"); break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dumpfunc(dumpdata, ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
|
eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
|
||||||
int type, int group_type __UNUSED__, void *data,
|
int type, int group_type __UNUSED__, void *data,
|
||||||
|
@ -2817,7 +2719,11 @@ eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Da
|
||||||
ret = eet_data_get_type(ed, type, echnk->data, ((char *)echnk->data) + echnk->size, ((char *)data));
|
ret = eet_data_get_type(ed, type, echnk->data, ((char *)echnk->data) + echnk->size, ((char *)data));
|
||||||
if (ret <= 0) return ret;
|
if (ret <= 0) return ret;
|
||||||
|
|
||||||
if (type == EET_T_STRING)
|
if (!edd && dumpfunc)
|
||||||
|
{
|
||||||
|
eet_data_dump_simple_type(type, echnk->name, data, level, dumpfunc, dumpdata);
|
||||||
|
}
|
||||||
|
else if (type == EET_T_STRING)
|
||||||
{
|
{
|
||||||
char **str;
|
char **str;
|
||||||
|
|
||||||
|
@ -2848,16 +2754,23 @@ eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Da
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ede->subtype)
|
else
|
||||||
|
{
|
||||||
|
Eet_Data_Descriptor *subtype;
|
||||||
|
|
||||||
|
subtype = ede ? ede->subtype : NULL;
|
||||||
|
|
||||||
|
if (subtype || dumpfunc)
|
||||||
{
|
{
|
||||||
void **ptr;
|
void **ptr;
|
||||||
|
|
||||||
data_ret = _eet_data_descriptor_decode(context, ed, ede->subtype, echnk->data, echnk->size, level + 1, dumpfunc, dumpdata);
|
data_ret = _eet_data_descriptor_decode(context, ed, subtype, echnk->data, echnk->size, level + 1, dumpfunc, dumpdata);
|
||||||
if (!data_ret) return 0;
|
if (!data_ret) return 0;
|
||||||
|
|
||||||
ptr = (void **)(((char *)data));
|
ptr = (void **)(((char *)data));
|
||||||
*ptr = (void *)data_ret;
|
*ptr = (void *)data_ret;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue