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
{
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
{
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:
{
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:
{
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:
#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); \
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
{
n = _eet_node_new(name, Eet_type); \
if (!n) return NULL; \
\
- n->data.Value = Value; \
+ n->data.value.Value = Value; \
\
return n; \
}
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; \
}
n = _eet_node_new(name, EET_T_NULL);
if (!n) return NULL;
- n->data.str = NULL;
+ n->data.value.str = NULL;
return 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:
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; \
}
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:
}
}
+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)
{