* eet: Add an experimentale API for walking Eet_Node.

This API should be used to generate native scripting object from
	an Eet_Data.


SVN revision: 45389
This commit is contained in:
Cedric BAIL 2010-01-21 12:45:35 +00:00
parent 33ba2279fc
commit 5a087664ba
5 changed files with 124 additions and 36 deletions

View File

@ -313,3 +313,7 @@
2010-01-17 Cedric BAIL
* Add a mempool for Eet_Node.
2010-01-21 Cedric BAIL
* Add experimental API to walk Eet_Node tree.

View File

@ -111,9 +111,40 @@ extern "C" {
typedef struct _Eet_Data_Descriptor Eet_Data_Descriptor;
typedef struct _Eet_Key Eet_Key;
typedef struct _Eet_Node Eet_Node;
typedef struct _Eet_Node_Data Eet_Node_Data;
typedef struct _Eet_Node_Walk Eet_Node_Walk;
typedef struct _Eet_Data_Descriptor_Class Eet_Data_Descriptor_Class;
struct _Eet_Node_Data
{
union {
char c;
short s;
int i;
long long l;
float f;
double d;
unsigned char uc;
unsigned short us;
unsigned int ui;
unsigned long long ul;
const char *str;
} value;
};
struct _Eet_Node_Walk
{
void *(*struct_alloc)(const char *type, void *user_data);
void (*struct_add)(void *parent, const char *name, void *child, void *user_data);
void *(*array)(Eina_Bool variable, const char *name, int count, void *user_data);
void (*insert)(void *array, int index, void *child, void *user_data);
void *(*list)(const char *name, void *user_data);
void (*append)(void *list, void *child, void *user_data);
void *(*hash)(void *parent, const char *name, const char *key, void *value, void *user_data);
void *(*simple)(int type, Eet_Node_Data *data, void *user_data);
};
#define EET_DATA_DESCRIPTOR_CLASS_VERSION 2
struct _Eet_Data_Descriptor_Class
{
@ -1507,6 +1538,9 @@ eet_dictionary_string_check * example: values), and @p type is the basic data
EAPI Eet_Node *eet_data_node_read_cipher(Eet_File *ef, const char *name, const char *key);
EAPI int eet_data_node_write_cipher(Eet_File *ef, const char *name, const char *key, Eet_Node *node, int compress);
/* EXPERIMENTAL: THIS API MAY CHANGE IN THE FUTUR, USE IT ONLY IF YOU KNOW WHAT YOU ARE DOING. */
EAPI void *eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, void *user_data);
/***************************************************************************/
#ifdef __cplusplus

View File

@ -61,19 +61,7 @@ struct _Eet_Node
Eet_Node *values;
Eet_Node *next;
Eet_Node *parent;
union {
char c;
short s;
int i;
long long l;
float f;
double d;
unsigned char uc;
unsigned short us;
unsigned int ui;
unsigned long long ul;
const char *str;
} data;
Eet_Node_Data data;
};
/*

View File

@ -1947,7 +1947,7 @@ _eet_data_dump_encode(int parent_type,
{
case EET_T_STRING:
case EET_T_INLINED_STRING:
data = eet_data_put_type(ed, n->type, &(n->data.str), &size);
data = eet_data_put_type(ed, n->type, &(n->data.value.str), &size);
if (data) eet_data_encode(ed, ds, data, node->name, size, n->type, node->type);
break;
case EET_T_NULL:
@ -1982,7 +1982,7 @@ _eet_data_dump_encode(int parent_type,
{
case EET_T_STRING:
case EET_T_INLINED_STRING:
data = eet_data_put_type(ed, n->type, &(n->data.str), &size);
data = eet_data_put_type(ed, n->type, &(n->data.value.str), &size);
if (data) eet_data_encode(ed, ds, data, node->name, size, n->type, node->type);
break;
case EET_T_NULL:
@ -2022,7 +2022,7 @@ _eet_data_dump_encode(int parent_type,
{
case EET_T_STRING:
case EET_T_INLINED_STRING:
data = eet_data_put_type(ed, n->type, &(n->data.str), &size);
data = eet_data_put_type(ed, n->type, &(n->data.value.str), &size);
if (data) eet_data_encode(ed, ds, data, node->name, size, n->type, node->type);
break;
case EET_T_NULL:
@ -2045,7 +2045,7 @@ _eet_data_dump_encode(int parent_type,
#define EET_DATA_NODE_ENCODE(Eet_Type, Type) \
case Eet_Type: \
data = eet_data_put_type(ed, node->type, &(node->data.Type), &size); \
data = eet_data_put_type(ed, node->type, &(node->data.value.Type), &size); \
if (data) \
{ \
eet_data_encode(ed, ds, data, node->name, size, node->type, parent_type); \
@ -2214,67 +2214,67 @@ _eet_data_dump_parse(Eet_Dictionary *ed,
if (!strcmp(tok3, "char:"))
{
n->type = EET_T_CHAR;
sscanf(tok4, "%hhi", &(n->data.c));
sscanf(tok4, "%hhi", &(n->data.value.c));
}
else if (!strcmp(tok3, "short:"))
{
n->type = EET_T_SHORT;
sscanf(tok4, "%hi", &(n->data.s));
sscanf(tok4, "%hi", &(n->data.value.s));
}
else if (!strcmp(tok3, "int:"))
{
n->type = EET_T_INT;
sscanf(tok4, "%i", &(n->data.i));
sscanf(tok4, "%i", &(n->data.value.i));
}
else if (!strcmp(tok3, "long_long:"))
{
n->type = EET_T_LONG_LONG;
sscanf(tok4, "%lli", &(n->data.l));
sscanf(tok4, "%lli", &(n->data.value.l));
}
else if (!strcmp(tok3, "float:"))
{
n->type = EET_T_FLOAT;
sscanf(tok4, "%f", &(n->data.f));
sscanf(tok4, "%f", &(n->data.value.f));
}
else if (!strcmp(tok3, "double:"))
{
n->type = EET_T_DOUBLE;
sscanf(tok4, "%lf", &(n->data.d));
sscanf(tok4, "%lf", &(n->data.value.d));
}
else if (!strcmp(tok3, "uchar:"))
{
n->type = EET_T_UCHAR;
sscanf(tok4, "%hhu", &(n->data.uc));
sscanf(tok4, "%hhu", &(n->data.value.uc));
}
else if (!strcmp(tok3, "ushort:"))
{
n->type = EET_T_USHORT;
sscanf(tok4, "%hu", &(n->data.us));
sscanf(tok4, "%hu", &(n->data.value.us));
}
else if (!strcmp(tok3, "uint:"))
{
n->type = EET_T_UINT;
sscanf(tok4, "%u", &(n->data.ui));
sscanf(tok4, "%u", &(n->data.value.ui));
}
else if (!strcmp(tok3, "ulong_long:"))
{
n->type = EET_T_ULONG_LONG;
sscanf(tok4, "%llu", &(n->data.ul));
sscanf(tok4, "%llu", &(n->data.value.ul));
}
else if (!strcmp(tok3, "string:"))
{
n->type = EET_T_STRING;
n->data.str = eina_stringshare_add(tok4);
n->data.value.str = eina_stringshare_add(tok4);
}
else if (!strcmp(tok3, "inlined:"))
{
n->type = EET_T_INLINED_STRING;
n->data.str = eina_stringshare_add(tok4);
n->data.value.str = eina_stringshare_add(tok4);
}
else if (!strcmp(tok3, "null"))
{
n->type = EET_T_NULL;
n->data.str = NULL;
n->data.value.str = NULL;
}
else
{

View File

@ -75,7 +75,7 @@ _eet_node_append(Eet_Node *n, Eina_List *nodes)
n = _eet_node_new(name, Eet_type); \
if (!n) return NULL; \
\
n->data.Value = Value; \
n->data.value.Value = Value; \
\
return n; \
}
@ -89,7 +89,7 @@ _eet_node_append(Eet_Node *n, Eina_List *nodes)
n = _eet_node_new(name, Eet_type); \
if (!n) return NULL; \
\
n->data.Value = eina_stringshare_add(Value); \
n->data.value.Value = eina_stringshare_add(Value); \
\
return n; \
}
@ -115,7 +115,7 @@ eet_node_null_new(const char *name)
n = _eet_node_new(name, EET_T_NULL);
if (!n) return NULL;
n->data.str = NULL;
n->data.value.str = NULL;
return n;
}
@ -328,7 +328,7 @@ eet_node_del(Eet_Node *n)
break;
case EET_T_STRING:
case EET_T_INLINED_STRING:
eina_stringshare_del(n->data.str);
eina_stringshare_del(n->data.value.str);
break;
case EET_T_CHAR:
case EET_T_SHORT:
@ -442,7 +442,7 @@ eet_node_dump_simple_type(Eet_Node *n, int level,
case Eet_Type: \
{ \
dumpfunc(dumpdata, eet_node_dump_t_name[Eet_Type][0]); \
snprintf(tbuf, sizeof (tbuf), eet_node_dump_t_name[Eet_Type][1], n->data.Type); \
snprintf(tbuf, sizeof (tbuf), eet_node_dump_t_name[Eet_Type][1], n->data.value.Type); \
dumpfunc(dumpdata, tbuf); \
break; \
}
@ -465,7 +465,7 @@ eet_node_dump_simple_type(Eet_Node *n, int level,
if (!type_name) type_name = "string: \"";
dumpfunc(dumpdata, type_name);
eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.str);
eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str);
dumpfunc(dumpdata, "\"");
break;
case EET_T_NULL:
@ -561,6 +561,68 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch
}
}
void*
eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, void *user_data)
{
Eet_Node *it;
void *me = NULL;
int i;
if (!root)
{
if (parent) cb->struct_add(parent, name, NULL, user_data);
return NULL;
}
switch (root->type)
{
case EET_G_UNKNOWN:
me = cb->struct_alloc(root->name, user_data);
for (it = root->values; it != NULL; it = it->next)
eet_node_walk(me, it->name, it, cb, user_data);
break;
case EET_G_VAR_ARRAY:
case EET_G_ARRAY:
me = cb->array(root->type == EET_G_VAR_ARRAY ? EINA_TRUE : EINA_FALSE,
root->name, root->count, user_data);
for (i = 0, it = root->values; it != NULL; it = it->next)
cb->insert(me, i++, eet_node_walk(NULL, NULL, it, cb, user_data), user_data);
break;
case EET_G_LIST:
me = cb->list(root->name, user_data);
for (it = root->values; it != NULL; it = it->next)
cb->append(me, eet_node_walk(NULL, NULL, it, cb, user_data), user_data);
break;
case EET_G_HASH:
if (!parent) return NULL;
return cb->hash(parent, root->name, root->key, eet_node_walk(NULL, NULL, root->values, cb, user_data), user_data);
case EET_T_STRING:
case EET_T_INLINED_STRING:
case EET_T_CHAR:
case EET_T_SHORT:
case EET_T_INT:
case EET_T_LONG_LONG:
case EET_T_FLOAT:
case EET_T_DOUBLE:
case EET_T_UCHAR:
case EET_T_USHORT:
case EET_T_UINT:
case EET_T_ULONG_LONG:
me = cb->simple(root->type, &root->data, user_data);
break;
}
if (parent) cb->struct_add(parent, name, me, user_data);
return me;
};
int
eet_node_init(void)
{