forked from enlightenment/efl
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
798 lines
18 KiB
798 lines
18 KiB
14 years ago
|
#ifdef HAVE_CONFIG_H
|
||
|
# include <config.h>
|
||
13 years ago
|
#endif /* ifdef HAVE_CONFIG_H */
|
||
14 years ago
|
|
||
14 years ago
|
#include <string.h>
|
||
14 years ago
|
#include <stdio.h>
|
||
14 years ago
|
|
||
14 years ago
|
#ifdef HAVE_EVIL
|
||
|
# include <Evil.h>
|
||
13 years ago
|
#endif /* ifdef HAVE_EVIL */
|
||
14 years ago
|
|
||
14 years ago
|
#include <Eina.h>
|
||
|
|
||
|
#include "Eet.h"
|
||
|
#include "Eet_private.h"
|
||
|
|
||
13 years ago
|
static Eina_Mempool *_eet_node_mp = NULL;
|
||
14 years ago
|
|
||
|
Eet_Node *
|
||
|
eet_node_new(void)
|
||
|
{
|
||
13 years ago
|
Eet_Node *result;
|
||
14 years ago
|
|
||
|
result = eina_mempool_malloc(_eet_node_mp, sizeof (Eet_Node));
|
||
|
if (!result)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
memset(result, 0, sizeof (Eet_Node));
|
||
|
return result;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
void
|
||
13 years ago
|
eet_node_free(Eet_Node *node)
|
||
14 years ago
|
{
|
||
|
eina_mempool_free(_eet_node_mp, node);
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
14 years ago
|
static Eet_Node *
|
||
13 years ago
|
_eet_node_new(const char *name,
|
||
|
int type)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
14 years ago
|
n = eet_node_new();
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
n->type = type;
|
||
|
n->name = eina_stringshare_add(name);
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
static void
|
||
12 years ago
|
_eet_node_append(Eet_Node *n,
|
||
|
Eina_List *nodes)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *value;
|
||
|
Eina_List *l;
|
||
14 years ago
|
|
||
|
EINA_LIST_REVERSE_FOREACH(nodes, l, value)
|
||
12 years ago
|
{
|
||
|
value->next = n->values;
|
||
|
n->values = value;
|
||
|
}
|
||
12 years ago
|
}
|
||
13 years ago
|
|
||
12 years ago
|
#define EET_NODE_NEW(Eet_type, Name, Value, Type) \
|
||
|
EAPI Eet_Node * \
|
||
|
eet_node_ ## Name ## _new(const char *name, Type Value) \
|
||
|
{ \
|
||
|
Eet_Node *n; \
|
||
|
\
|
||
|
n = _eet_node_new(name, Eet_type); \
|
||
|
if (!n) { return NULL; } \
|
||
|
\
|
||
|
n->data.value.Value = Value; \
|
||
|
\
|
||
|
return n; \
|
||
|
}
|
||
|
|
||
|
#define EET_NODE_STR_NEW(Eet_type, Name, Value, Type) \
|
||
|
EAPI Eet_Node * \
|
||
|
eet_node_ ## Name ## _new(const char *name, Type Value) \
|
||
|
{ \
|
||
|
Eet_Node *n; \
|
||
|
\
|
||
|
n = _eet_node_new(name, Eet_type); \
|
||
|
if (!n) { return NULL; } \
|
||
|
\
|
||
|
n->data.value.Value = eina_stringshare_add(Value); \
|
||
|
\
|
||
|
return n; \
|
||
|
}
|
||
|
|
||
|
EET_NODE_NEW(EET_T_CHAR, char, c, char)
|
||
|
EET_NODE_NEW(EET_T_SHORT, short, s, short)
|
||
|
EET_NODE_NEW(EET_T_INT, int, i, int)
|
||
|
EET_NODE_NEW(EET_T_LONG_LONG, long_long, l, long long)
|
||
|
EET_NODE_NEW(EET_T_FLOAT, float, f, float)
|
||
|
EET_NODE_NEW(EET_T_DOUBLE, double, d, double)
|
||
|
EET_NODE_NEW(EET_T_UCHAR, unsigned_char, uc, unsigned char)
|
||
|
EET_NODE_NEW(EET_T_USHORT, unsigned_short, us, unsigned short)
|
||
|
EET_NODE_NEW(EET_T_UINT, unsigned_int, ui, unsigned int)
|
||
14 years ago
|
EET_NODE_NEW(EET_T_ULONG_LONG, unsigned_long_long, ul, unsigned long long)
|
||
12 years ago
|
EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *)
|
||
14 years ago
|
EET_NODE_STR_NEW(EET_T_INLINED_STRING, inlined_string, str, const char *)
|
||
14 years ago
|
|
||
|
Eet_Node *
|
||
13 years ago
|
eet_node_null_new(const char *name)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
|
n = _eet_node_new(name, EET_T_NULL);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
14 years ago
|
n->data.value.str = NULL;
|
||
14 years ago
|
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
Eet_Node *
|
||
13 years ago
|
eet_node_list_new(const char *name,
|
||
13 years ago
|
Eina_List *nodes)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
|
n = _eet_node_new(name, EET_G_LIST);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
_eet_node_append(n, nodes);
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
Eet_Node *
|
||
13 years ago
|
eet_node_array_new(const char *name,
|
||
|
int count,
|
||
13 years ago
|
Eina_List *nodes)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
|
n = _eet_node_new(name, EET_G_ARRAY);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
n->count = count;
|
||
|
|
||
|
_eet_node_append(n, nodes);
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
Eet_Node *
|
||
13 years ago
|
eet_node_var_array_new(const char *name,
|
||
13 years ago
|
Eina_List *nodes)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
|
n = _eet_node_new(name, EET_G_VAR_ARRAY);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
14 years ago
|
n->count = eina_list_count(nodes);
|
||
14 years ago
|
|
||
|
_eet_node_append(n, nodes);
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
Eet_Node *
|
||
13 years ago
|
eet_node_hash_new(const char *name,
|
||
|
const char *key,
|
||
13 years ago
|
Eet_Node *node)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eina_List *nodes;
|
||
|
Eet_Node *n;
|
||
14 years ago
|
|
||
13 years ago
|
if (!node)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
14 years ago
|
n = _eet_node_new(name, EET_G_HASH);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
n->key = eina_stringshare_add(key);
|
||
14 years ago
|
nodes = eina_list_append(NULL, node);
|
||
14 years ago
|
|
||
|
_eet_node_append(n, nodes);
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
Eet_Node *
|
||
13 years ago
|
eet_node_struct_new(const char *name,
|
||
13 years ago
|
Eina_List *nodes)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
|
n = _eet_node_new(name, EET_G_UNKNOWN);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
_eet_node_append(n, nodes);
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
14 years ago
|
Eet_Node *
|
||
13 years ago
|
eet_node_struct_child_new(const char *parent,
|
||
13 years ago
|
Eet_Node *child)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *n;
|
||
14 years ago
|
|
||
12 years ago
|
if (!child) return NULL;
|
||
|
|
||
14 years ago
|
if (child->type != EET_G_UNKNOWN)
|
||
12 years ago
|
return child;
|
||
14 years ago
|
|
||
|
n = _eet_node_new(parent, EET_G_UNKNOWN);
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return NULL;
|
||
14 years ago
|
|
||
|
_eet_node_append(n, eina_list_prepend(NULL, child));
|
||
|
|
||
|
return n;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
12 years ago
|
Eet_Node *
|
||
|
eet_node_children_get(Eet_Node *node)
|
||
|
{
|
||
|
if (!node) return NULL;
|
||
|
return node->values;
|
||
|
}
|
||
|
|
||
|
Eet_Node *
|
||
|
eet_node_next_get(Eet_Node *node)
|
||
|
{
|
||
|
if (!node) return NULL;
|
||
|
return node->next;
|
||
|
}
|
||
|
|
||
|
Eet_Node *
|
||
|
eet_node_parent_get(Eet_Node *node)
|
||
|
{
|
||
|
if (!node) return NULL;
|
||
|
return node->parent;
|
||
|
}
|
||
|
|
||
14 years ago
|
void
|
||
13 years ago
|
eet_node_list_append(Eet_Node *parent,
|
||
13 years ago
|
const char *name,
|
||
13 years ago
|
Eet_Node *child)
|
||
14 years ago
|
{
|
||
13 years ago
|
const char *tmp;
|
||
|
Eet_Node *nn;
|
||
14 years ago
|
|
||
12 years ago
|
if ((!parent) || (!child)) return;
|
||
14 years ago
|
tmp = eina_stringshare_add(name);
|
||
|
|
||
|
for (nn = parent->values; nn; nn = nn->next)
|
||
12 years ago
|
if (nn->name == tmp && nn->type == EET_G_LIST)
|
||
|
{
|
||
|
Eet_Node *n;
|
||
13 years ago
|
|
||
12 years ago
|
if (!nn->values)
|
||
|
nn->values = child;
|
||
|
else
|
||
|
{
|
||
|
for (n = nn->values; n->next; n = n->next)
|
||
|
;
|
||
|
n->next = child;
|
||
|
}
|
||
14 years ago
|
|
||
12 years ago
|
child->next = NULL;
|
||
14 years ago
|
|
||
12 years ago
|
eina_stringshare_del(tmp);
|
||
14 years ago
|
|
||
12 years ago
|
return;
|
||
|
}
|
||
14 years ago
|
|
||
|
/* No list found, so create it. */
|
||
|
nn = eet_node_list_new(tmp, eina_list_append(NULL, child));
|
||
|
|
||
|
/* And add it to the parent. */
|
||
|
nn->next = parent->values;
|
||
|
parent->values = nn;
|
||
|
|
||
13 years ago
|
eina_stringshare_del(tmp);
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
void
|
||
13 years ago
|
eet_node_struct_append(Eet_Node *parent,
|
||
13 years ago
|
const char *name,
|
||
13 years ago
|
Eet_Node *child)
|
||
14 years ago
|
{
|
||
13 years ago
|
const char *tmp;
|
||
|
Eet_Node *prev;
|
||
|
Eet_Node *nn;
|
||
14 years ago
|
|
||
12 years ago
|
if ((!parent) || (!child)) return;
|
||
14 years ago
|
if (parent->type != EET_G_UNKNOWN)
|
||
|
{
|
||
13 years ago
|
ERR("[%s] is not a structure. Will not insert [%s] in it",
|
||
|
parent->name,
|
||
|
name);
|
||
13 years ago
|
eet_node_del(child);
|
||
13 years ago
|
return;
|
||
14 years ago
|
}
|
||
|
|
||
|
tmp = eina_stringshare_add(name);
|
||
|
|
||
|
for (prev = NULL, nn = parent->values; nn; prev = nn, nn = nn->next)
|
||
12 years ago
|
if (nn->name == tmp && nn->type == child->type)
|
||
|
{
|
||
|
if (prev)
|
||
|
prev->next = nn->next;
|
||
|
else
|
||
|
parent->values = nn->next;
|
||
14 years ago
|
|
||
12 years ago
|
nn->next = NULL;
|
||
|
eet_node_del(nn);
|
||
14 years ago
|
|
||
12 years ago
|
break;
|
||
|
}
|
||
14 years ago
|
|
||
|
if (prev)
|
||
|
{
|
||
13 years ago
|
prev->next = child;
|
||
|
child->next = NULL;
|
||
14 years ago
|
}
|
||
|
else
|
||
|
{
|
||
13 years ago
|
child->next = NULL;
|
||
|
parent->values = child;
|
||
14 years ago
|
}
|
||
|
|
||
13 years ago
|
eina_stringshare_del(tmp);
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
void
|
||
13 years ago
|
eet_node_hash_add(Eet_Node *parent,
|
||
13 years ago
|
const char *name,
|
||
|
const char *key,
|
||
13 years ago
|
Eet_Node *child)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *nn;
|
||
14 years ago
|
|
||
12 years ago
|
if ((!parent) || (!child)) return;
|
||
|
|
||
14 years ago
|
/* No list found, so create it. */
|
||
|
nn = eet_node_hash_new(name, key, child);
|
||
|
|
||
|
/* And add it to the parent. */
|
||
|
nn->next = parent->values;
|
||
|
parent->values = nn;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
12 years ago
|
int
|
||
|
eet_node_type_get(Eet_Node *node)
|
||
|
{
|
||
|
if (!node) return EET_T_UNKNOW;
|
||
|
return node->type;
|
||
|
}
|
||
|
|
||
|
Eet_Node_Data *
|
||
|
eet_node_value_get(Eet_Node *node)
|
||
|
{
|
||
|
if (!node) return NULL;
|
||
|
return &node->data;
|
||
|
}
|
||
|
|
||
|
const char *
|
||
|
eet_node_name_get(Eet_Node *node)
|
||
|
{
|
||
|
if (!node) return NULL;
|
||
|
return node->name;
|
||
|
}
|
||
|
|
||
14 years ago
|
void
|
||
13 years ago
|
eet_node_del(Eet_Node *n)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *nn;
|
||
|
Eet_Node *tmp;
|
||
14 years ago
|
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return;
|
||
14 years ago
|
|
||
14 years ago
|
switch (n->type)
|
||
|
{
|
||
|
case EET_G_HASH:
|
||
12 years ago
|
eina_stringshare_del(n->key);
|
||
13 years ago
|
|
||
14 years ago
|
case EET_G_UNKNOWN:
|
||
|
case EET_G_VAR_ARRAY:
|
||
|
case EET_G_ARRAY:
|
||
|
case EET_G_LIST:
|
||
12 years ago
|
for (nn = n->values; nn; )
|
||
|
{
|
||
|
tmp = nn;
|
||
|
nn = nn->next;
|
||
|
eet_node_del(tmp);
|
||
|
}
|
||
|
break;
|
||
13 years ago
|
|
||
14 years ago
|
case EET_T_STRING:
|
||
|
case EET_T_INLINED_STRING:
|
||
12 years ago
|
eina_stringshare_del(n->data.value.str);
|
||
|
break;
|
||
13 years ago
|
|
||
14 years ago
|
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:
|
||
12 years ago
|
break;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
13 years ago
|
eina_stringshare_del(n->name);
|
||
|
eet_node_free(n);
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
13 years ago
|
static const char *eet_node_dump_g_name[6] = {
|
||
13 years ago
|
"struct",
|
||
|
"array",
|
||
|
"var_array",
|
||
|
"list",
|
||
|
"hash",
|
||
|
"???"
|
||
14 years ago
|
};
|
||
|
|
||
13 years ago
|
static const char *eet_node_dump_t_name[14][2] = {
|
||
13 years ago
|
{ "???: ", "???" },
|
||
|
{ "char: ", "%hhi" },
|
||
|
{ "short: ", "%hi" },
|
||
|
{ "int: ", "%i" },
|
||
|
{ "long_long: ", "%lli" },
|
||
|
{ "float: ", "%1.25f" },
|
||
|
{ "double: ", "%1.25f" },
|
||
|
{ "uchar: ", "%hhu" },
|
||
|
{ "ushort: ", "%i" },
|
||
|
{ "uint: ", "%u" },
|
||
|
{ "ulong_long: ", "%llu" },
|
||
|
{ "null", "" }
|
||
14 years ago
|
};
|
||
|
|
||
|
static void
|
||
12 years ago
|
eet_node_dump_level(int level,
|
||
13 years ago
|
Eet_Dump_Callback dumpfunc,
|
||
12 years ago
|
void *dumpdata)
|
||
14 years ago
|
{
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
static char *
|
||
13 years ago
|
eet_node_string_escape(const char *str)
|
||
14 years ago
|
{
|
||
13 years ago
|
char *s, *sp;
|
||
|
const char *strp;
|
||
14 years ago
|
int sz = 0;
|
||
|
|
||
|
for (strp = str; *strp; strp++)
|
||
|
{
|
||
13 years ago
|
if (*strp == '\"')
|
||
12 years ago
|
sz += 2;
|
||
13 years ago
|
else if (*strp == '\\')
|
||
12 years ago
|
sz += 2;
|
||
13 years ago
|
else if (*strp == '\n')
|
||
12 years ago
|
sz += 2;
|
||
13 years ago
|
else
|
||
12 years ago
|
sz += 1;
|
||
14 years ago
|
}
|
||
|
s = malloc(sz + 1);
|
||
13 years ago
|
if (!s)
|
||
12 years ago
|
return NULL;
|
||
13 years ago
|
|
||
14 years ago
|
for (strp = str, sp = s; *strp; strp++, sp++)
|
||
|
{
|
||
13 years ago
|
if (*strp == '\"'
|
||
|
|| *strp == '\\'
|
||
|
|| *strp == '\n')
|
||
|
{
|
||
|
*sp = '\\';
|
||
|
sp++;
|
||
|
}
|
||
|
|
||
|
if (*strp == '\n')
|
||
12 years ago
|
*sp = 'n';
|
||
13 years ago
|
else
|
||
12 years ago
|
*sp = *strp;
|
||
14 years ago
|
}
|
||
|
*sp = 0;
|
||
|
return s;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
static void
|
||
12 years ago
|
eet_node_dump_string_escape(void *dumpdata,
|
||
13 years ago
|
Eet_Dump_Callback dumpfunc,
|
||
12 years ago
|
const char *str)
|
||
14 years ago
|
{
|
||
13 years ago
|
char *s;
|
||
14 years ago
|
|
||
|
s = eet_node_string_escape(str);
|
||
13 years ago
|
if (!s)
|
||
12 years ago
|
return;
|
||
14 years ago
|
|
||
|
dumpfunc(dumpdata, s);
|
||
|
free(s);
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
static void
|
||
12 years ago
|
eet_node_dump_simple_type(Eet_Node *n,
|
||
|
int level,
|
||
13 years ago
|
Eet_Dump_Callback dumpfunc,
|
||
12 years ago
|
void *dumpdata)
|
||
14 years ago
|
{
|
||
13 years ago
|
const char *type_name = NULL;
|
||
14 years ago
|
char tbuf[256];
|
||
|
|
||
|
eet_node_dump_level(level, dumpfunc, dumpdata);
|
||
14 years ago
|
dumpfunc(dumpdata, "value \"");
|
||
14 years ago
|
eet_node_dump_string_escape(dumpdata, dumpfunc, n->name);
|
||
13 years ago
|
dumpfunc(dumpdata, "\" ");
|
||
14 years ago
|
|
||
14 years ago
|
#ifdef EET_T_TYPE
|
||
|
# undef EET_T_TYPE
|
||
13 years ago
|
#endif /* ifdef EET_T_TYPE */
|
||
|
|
||
12 years ago
|
#define EET_T_TYPE(Eet_Type, Type) \
|
||
|
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.value.Type); \
|
||
|
dumpfunc(dumpdata, tbuf); \
|
||
|
break; \
|
||
|
}
|
||
14 years ago
|
|
||
|
switch (n->type)
|
||
|
{
|
||
12 years ago
|
EET_T_TYPE(EET_T_CHAR, c);
|
||
|
EET_T_TYPE(EET_T_SHORT, s);
|
||
|
EET_T_TYPE(EET_T_INT, i);
|
||
|
EET_T_TYPE(EET_T_LONG_LONG, l);
|
||
|
EET_T_TYPE(EET_T_FLOAT, f);
|
||
|
EET_T_TYPE(EET_T_DOUBLE, d);
|
||
|
EET_T_TYPE(EET_T_UCHAR, uc);
|
||
|
EET_T_TYPE(EET_T_USHORT, us);
|
||
|
EET_T_TYPE(EET_T_UINT, ui);
|
||
13 years ago
|
EET_T_TYPE(EET_T_ULONG_LONG, ul);
|
||
|
|
||
14 years ago
|
case EET_T_INLINED_STRING:
|
||
12 years ago
|
type_name = "inlined: \"";
|
||
13 years ago
|
|
||
14 years ago
|
case EET_T_STRING:
|
||
12 years ago
|
if (!type_name)
|
||
|
type_name = "string: \"";
|
||
13 years ago
|
|
||
12 years ago
|
dumpfunc(dumpdata, type_name);
|
||
|
eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str);
|
||
|
dumpfunc(dumpdata, "\"");
|
||
|
break;
|
||
14 years ago
|
|
||
|
case EET_T_NULL:
|
||
12 years ago
|
dumpfunc(dumpdata, "null");
|
||
|
break;
|
||
13 years ago
|
|
||
14 years ago
|
default:
|
||
12 years ago
|
dumpfunc(dumpdata, "???: ???");
|
||
|
break;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
13 years ago
|
dumpfunc(dumpdata, ";\n");
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
14 years ago
|
static void
|
||
12 years ago
|
eet_node_dump_group_start(int level,
|
||
13 years ago
|
Eet_Dump_Callback dumpfunc,
|
||
12 years ago
|
void *dumpdata,
|
||
|
int group_type,
|
||
|
const char *name)
|
||
14 years ago
|
{
|
||
|
int chnk_type;
|
||
|
|
||
|
chnk_type = (group_type >= EET_G_UNKNOWN && group_type <= EET_G_HASH) ?
|
||
12 years ago
|
group_type : EET_G_LAST;
|
||
14 years ago
|
|
||
|
eet_node_dump_level(level, dumpfunc, dumpdata);
|
||
|
dumpfunc(dumpdata, "group \"");
|
||
|
eet_node_dump_string_escape(dumpdata, dumpfunc, name);
|
||
12 years ago
|
dumpfunc(dumpdata, "\" ");
|
||
14 years ago
|
|
||
|
dumpfunc(dumpdata, eet_node_dump_g_name[chnk_type - EET_G_UNKNOWN]);
|
||
12 years ago
|
dumpfunc(dumpdata, " {\n");
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
static void
|
||
12 years ago
|
eet_node_dump_group_end(int level,
|
||
13 years ago
|
Eet_Dump_Callback dumpfunc,
|
||
12 years ago
|
void *dumpdata)
|
||
14 years ago
|
{
|
||
|
eet_node_dump_level(level, dumpfunc, dumpdata);
|
||
14 years ago
|
dumpfunc(dumpdata, "}\n");
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
14 years ago
|
void
|
||
12 years ago
|
eet_node_dump(Eet_Node *n,
|
||
|
int dumplevel,
|
||
13 years ago
|
Eet_Dump_Callback dumpfunc,
|
||
12 years ago
|
void *dumpdata)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *it;
|
||
14 years ago
|
|
||
13 years ago
|
if (!n)
|
||
12 years ago
|
return;
|
||
14 years ago
|
|
||
14 years ago
|
switch (n->type)
|
||
|
{
|
||
|
case EET_G_VAR_ARRAY:
|
||
|
case EET_G_ARRAY:
|
||
14 years ago
|
case EET_G_UNKNOWN:
|
||
|
case EET_G_HASH:
|
||
14 years ago
|
case EET_G_LIST:
|
||
12 years ago
|
eet_node_dump_group_start(dumplevel,
|
||
|
dumpfunc,
|
||
|
dumpdata,
|
||
|
n->type,
|
||
|
n->name);
|
||
|
|
||
|
if (n->type == EET_G_VAR_ARRAY
|
||
|
|| n->type == EET_G_ARRAY)
|
||
|
{
|
||
|
char tbuf[256];
|
||
|
|
||
|
eet_node_dump_level(dumplevel, dumpfunc, dumpdata);
|
||
|
dumpfunc(dumpdata, " count ");
|
||
|
eina_convert_itoa(n->count, tbuf);
|
||
|
dumpfunc(dumpdata, tbuf);
|
||
|
dumpfunc(dumpdata, ";\n");
|
||
|
}
|
||
|
else if (n->type == EET_G_HASH)
|
||
|
{
|
||
|
eet_node_dump_level(dumplevel, dumpfunc, dumpdata);
|
||
|
dumpfunc(dumpdata, " key \"");
|
||
|
eet_node_dump_string_escape(dumpdata, dumpfunc, n->key);
|
||
|
dumpfunc(dumpdata, "\";\n");
|
||
|
}
|
||
|
|
||
|
for (it = n->values; it; it = it->next)
|
||
|
eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata);
|
||
|
|
||
|
eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata);
|
||
|
break;
|
||
13 years ago
|
|
||
14 years ago
|
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:
|
||
14 years ago
|
case EET_T_ULONG_LONG:
|
||
12 years ago
|
eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata);
|
||
|
break;
|
||
12 years ago
|
}
|
||
|
}
|
||
14 years ago
|
|
||
13 years ago
|
void *
|
||
13 years ago
|
eet_node_walk(void *parent,
|
||
|
const char *name,
|
||
|
Eet_Node *root,
|
||
13 years ago
|
Eet_Node_Walk *cb,
|
||
13 years ago
|
void *user_data)
|
||
14 years ago
|
{
|
||
13 years ago
|
Eet_Node *it;
|
||
|
void *me = NULL;
|
||
14 years ago
|
int i;
|
||
|
|
||
|
if (!root)
|
||
|
{
|
||
13 years ago
|
if (parent)
|
||
12 years ago
|
cb->struct_add(parent, name, NULL, user_data);
|
||
13 years ago
|
|
||
|
return NULL;
|
||
14 years ago
|
}
|
||
|
|
||
|
switch (root->type)
|
||
|
{
|
||
|
case EET_G_UNKNOWN:
|
||
12 years ago
|
me = cb->struct_alloc(root->name, user_data);
|
||
13 years ago
|
|
||
12 years ago
|
for (it = root->values; it; it = it->next)
|
||
|
eet_node_walk(me, it->name, it, cb, user_data);
|
||
14 years ago
|
|
||
12 years ago
|
break;
|
||
14 years ago
|
|
||
|
case EET_G_VAR_ARRAY:
|
||
|
case EET_G_ARRAY:
|
||
12 years ago
|
me = cb->array(root->type == EET_G_VAR_ARRAY ? EINA_TRUE : EINA_FALSE,
|
||
|
root->name, root->count, user_data);
|
||
14 years ago
|
|
||
12 years ago
|
for (i = 0, it = root->values; it; it = it->next)
|
||
|
cb->insert(me, i++, eet_node_walk(NULL,
|
||
|
NULL,
|
||
|
it,
|
||
|
cb,
|
||
|
user_data), user_data);
|
||
13 years ago
|
|
||
12 years ago
|
break;
|
||
14 years ago
|
|
||
|
case EET_G_LIST:
|
||
12 years ago
|
me = cb->list(root->name, user_data);
|
||
13 years ago
|
|
||
12 years ago
|
for (it = root->values; it; it = it->next)
|
||
|
cb->append(me, eet_node_walk(NULL,
|
||
|
NULL,
|
||
|
it,
|
||
|
cb,
|
||
|
user_data), user_data);
|
||
14 years ago
|
|
||
12 years ago
|
break;
|
||
14 years ago
|
|
||
|
case EET_G_HASH:
|
||
12 years ago
|
if (!parent)
|
||
|
return NULL;
|
||
13 years ago
|
|
||
12 years ago
|
return cb->hash(parent, root->name, root->key,
|
||
|
eet_node_walk(NULL,
|
||
|
NULL,
|
||
|
root->values,
|
||
|
cb,
|
||
|
user_data), user_data);
|
||
14 years ago
|
|
||
|
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:
|
||
12 years ago
|
me = cb->simple(root->type, &root->data, user_data);
|
||
|
break;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
13 years ago
|
if (parent)
|
||
12 years ago
|
cb->struct_add(parent, name, me, user_data);
|
||
13 years ago
|
|
||
14 years ago
|
return me;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
14 years ago
|
int
|
||
|
eet_node_init(void)
|
||
|
{
|
||
13 years ago
|
const char *choice;
|
||
|
const char *tmp;
|
||
14 years ago
|
|
||
13 years ago
|
#ifdef EINA_DEFAULT_MEMPOOL
|
||
|
choice = "pass_through";
|
||
|
#else
|
||
14 years ago
|
choice = "chained_mempool";
|
||
13 years ago
|
#endif
|
||
12 years ago
|
tmp = getenv("EINA_MEMPOOL");
|
||
14 years ago
|
if (tmp && tmp[0])
|
||
12 years ago
|
choice = tmp;
|
||
14 years ago
|
|
||
13 years ago
|
_eet_node_mp =
|
||
11 years ago
|
eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 32);
|
||
14 years ago
|
|
||
|
return _eet_node_mp ? 1 : 0;
|
||
12 years ago
|
}
|
||
14 years ago
|
|
||
|
void
|
||
|
eet_node_shutdown(void)
|
||
|
{
|
||
|
eina_mempool_del(_eet_node_mp);
|
||
|
_eet_node_mp = NULL;
|
||
12 years ago
|
}
|
||
13 years ago
|
|