diff options
Diffstat (limited to 'src/lib/eet_node.c')
-rw-r--r-- | src/lib/eet_node.c | 534 |
1 files changed, 309 insertions, 225 deletions
diff --git a/src/lib/eet_node.c b/src/lib/eet_node.c index 6f33dda..06c2fdb 100644 --- a/src/lib/eet_node.c +++ b/src/lib/eet_node.c @@ -27,7 +27,7 @@ eet_node_new(void) result = eina_mempool_malloc(_eet_node_mp, sizeof (Eet_Node)); if (!result) - return NULL; + return NULL; memset(result, 0, sizeof (Eet_Node)); return result; @@ -45,7 +45,8 @@ _eet_node_new(const char *name, int type) Eet_Node *n; n = eet_node_new(); - if (!n) return NULL; + if (!n) + return NULL; n->type = type; n->name = eina_stringshare_add(name); @@ -60,51 +61,51 @@ _eet_node_append(Eet_Node *n, Eina_List *nodes) Eina_List *l; EINA_LIST_REVERSE_FOREACH(nodes, l, value) - { - value->next = n->values; - n->values = value; - } + { + value->next = n->values; + n->values = value; + } } -#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) +#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) EET_NODE_NEW(EET_T_ULONG_LONG, unsigned_long_long, ul, unsigned long long) -EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *) +EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *) EET_NODE_STR_NEW(EET_T_INLINED_STRING, inlined_string, str, const char *) Eet_Node * @@ -113,7 +114,8 @@ eet_node_null_new(const char *name) Eet_Node *n; n = _eet_node_new(name, EET_T_NULL); - if (!n) return NULL; + if (!n) + return NULL; n->data.value.str = NULL; @@ -126,7 +128,8 @@ eet_node_list_new(const char *name, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_LIST); - if (!n) return NULL; + if (!n) + return NULL; _eet_node_append(n, nodes); @@ -139,7 +142,8 @@ eet_node_array_new(const char *name, int count, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_ARRAY); - if (!n) return NULL; + if (!n) + return NULL; n->count = count; @@ -154,7 +158,8 @@ eet_node_var_array_new(const char *name, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_VAR_ARRAY); - if (!n) return NULL; + if (!n) + return NULL; n->count = eina_list_count(nodes); @@ -169,10 +174,12 @@ eet_node_hash_new(const char *name, const char *key, Eet_Node *node) Eina_List *nodes; Eet_Node *n; - if (!node) return NULL; + if (!node) + return NULL; n = _eet_node_new(name, EET_G_HASH); - if (!n) return NULL; + if (!n) + return NULL; n->key = eina_stringshare_add(key); nodes = eina_list_append(NULL, node); @@ -188,7 +195,8 @@ eet_node_struct_new(const char *name, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_UNKNOWN); - if (!n) return NULL; + if (!n) + return NULL; _eet_node_append(n, nodes); @@ -201,10 +209,11 @@ eet_node_struct_child_new(const char *parent, Eet_Node *child) Eet_Node *n; if (child->type != EET_G_UNKNOWN) - return child; + return child; n = _eet_node_new(parent, EET_G_UNKNOWN); - if (!n) return NULL; + if (!n) + return NULL; _eet_node_append(n, eina_list_prepend(NULL, child)); @@ -220,23 +229,25 @@ eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child) tmp = eina_stringshare_add(name); for (nn = parent->values; nn; nn = nn->next) - if (nn->name == tmp && nn->type == EET_G_LIST) - { - Eet_Node *n; + if (nn->name == tmp && nn->type == EET_G_LIST) + { + Eet_Node *n; + + if (!nn->values) + nn->values = child; + else + { + for (n = nn->values; n->next; n = n->next) + ; + n->next = child; + } - if (!nn->values) nn->values = child; - else - { - for (n = nn->values; n->next; n = n->next) - ; - n->next = child; - } - child->next = NULL; + child->next = NULL; - eina_stringshare_del(tmp); + eina_stringshare_del(tmp); - return ; - } + return; + } /* No list found, so create it. */ nn = eet_node_list_new(tmp, eina_list_append(NULL, child)); @@ -245,7 +256,7 @@ eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child) nn->next = parent->values; parent->values = nn; - eina_stringshare_del(tmp); + eina_stringshare_del(tmp); } void @@ -257,41 +268,48 @@ eet_node_struct_append(Eet_Node *parent, const char *name, Eet_Node *child) if (parent->type != EET_G_UNKNOWN) { - ERR("[%s] is not a structure. Will not insert [%s] in it", parent->name, name); - eet_node_del(child); - return ; + ERR("[%s] is not a structure. Will not insert [%s] in it", + parent->name, + name); + eet_node_del(child); + return; } tmp = eina_stringshare_add(name); for (prev = NULL, nn = parent->values; nn; prev = nn, nn = nn->next) - if (nn->name == tmp && nn->type == child->type) - { - if (prev) prev->next = nn->next; - else parent->values = nn->next; + if (nn->name == tmp && nn->type == child->type) + { + if (prev) + prev->next = nn->next; + else + parent->values = nn->next; - nn->next = NULL; - eet_node_del(nn); + nn->next = NULL; + eet_node_del(nn); - break; - } + break; + } if (prev) { - prev->next = child; - child->next = NULL; + prev->next = child; + child->next = NULL; } else { - child->next = NULL; - parent->values = child; + child->next = NULL; + parent->values = child; } - eina_stringshare_del(tmp); + eina_stringshare_del(tmp); } void -eet_node_hash_add(Eet_Node *parent, const char *name, const char *key, Eet_Node *child) +eet_node_hash_add(Eet_Node *parent, + const char *name, + const char *key, + Eet_Node *child) { Eet_Node *nn; @@ -309,27 +327,31 @@ eet_node_del(Eet_Node *n) Eet_Node *nn; Eet_Node *tmp; - if (!n) return ; + if (!n) + return; switch (n->type) { case EET_G_HASH: - eina_stringshare_del(n->key); + eina_stringshare_del(n->key); + case EET_G_UNKNOWN: case EET_G_VAR_ARRAY: case EET_G_ARRAY: case EET_G_LIST: - for (nn = n->values; nn; ) - { - tmp = nn; - nn = nn->next; - eet_node_del(tmp); - } - break; + for (nn = n->values; nn; ) + { + tmp = nn; + nn = nn->next; + eet_node_del(tmp); + } + break; + case EET_T_STRING: case EET_T_INLINED_STRING: - eina_stringshare_del(n->data.value.str); - break; + eina_stringshare_del(n->data.value.str); + break; + case EET_T_CHAR: case EET_T_SHORT: case EET_T_INT: @@ -339,39 +361,41 @@ eet_node_del(Eet_Node *n) case EET_T_UCHAR: case EET_T_USHORT: case EET_T_UINT: - break; + break; } - eina_stringshare_del(n->name); - eet_node_free(n); + eina_stringshare_del(n->name); + eet_node_free(n); } static const char *eet_node_dump_g_name[6] = { - "struct", - "array", - "var_array", - "list", - "hash", - "???" + "struct", + "array", + "var_array", + "list", + "hash", + "???" }; static const char *eet_node_dump_t_name[14][2] = { - { "???: ", "???" }, - { "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", "" } + { "???: ", "???" }, + { "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", "" } }; static void -eet_node_dump_level(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata) +eet_node_dump_level(int level, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata) { int i; @@ -387,36 +411,48 @@ eet_node_string_escape(const char *str) for (strp = str; *strp; strp++) { - if (*strp == '\"') sz += 2; - else if (*strp == '\\') sz += 2; - else if (*strp == '\n') sz += 2; - else sz += 1; + if (*strp == '\"') + sz += 2; + else if (*strp == '\\') + sz += 2; + else if (*strp == '\n') + sz += 2; + else + sz += 1; } s = malloc(sz + 1); - if (!s) return NULL; + if (!s) + return NULL; + for (strp = str, sp = s; *strp; strp++, sp++) { - if (*strp == '\"' - || *strp == '\\' - || *strp == '\n') - { - *sp = '\\'; - sp++; - } - if (*strp == '\n') *sp = 'n'; - else *sp = *strp; + if (*strp == '\"' + || *strp == '\\' + || *strp == '\n') + { + *sp = '\\'; + sp++; + } + + if (*strp == '\n') + *sp = 'n'; + else + *sp = *strp; } *sp = 0; return s; } static void -eet_node_dump_string_escape(void *dumpdata, void dumpfunc(void *data, const char *str), const char *str) +eet_node_dump_string_escape(void *dumpdata, void dumpfunc(void *data, + const char *str), + const char *str) { char *s; s = eet_node_string_escape(str); - if (!s) return ; + if (!s) + return; dumpfunc(dumpdata, s); free(s); @@ -424,7 +460,8 @@ eet_node_dump_string_escape(void *dumpdata, void dumpfunc(void *data, const char static void eet_node_dump_simple_type(Eet_Node *n, int level, - void (*dumpfunc) (void *data, const char *str), void *dumpdata) + void (*dumpfunc)(void *data, + const char *str), void *dumpdata) { const char *type_name = NULL; char tbuf[256]; @@ -432,84 +469,99 @@ eet_node_dump_simple_type(Eet_Node *n, int level, eet_node_dump_level(level, dumpfunc, dumpdata); dumpfunc(dumpdata, "value \""); eet_node_dump_string_escape(dumpdata, dumpfunc, n->name); - dumpfunc(dumpdata, "\" "); + dumpfunc(dumpdata, "\" "); #ifdef EET_T_TYPE # undef EET_T_TYPE #endif -#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; \ - } +#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; \ + } switch (n->type) { - 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); - EET_T_TYPE(EET_T_ULONG_LONG, ul); + 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); + EET_T_TYPE(EET_T_ULONG_LONG, ul); + case EET_T_INLINED_STRING: - type_name = "inlined: \""; + type_name = "inlined: \""; + case EET_T_STRING: - if (!type_name) type_name = "string: \""; + if (!type_name) + type_name = "string: \""; + + dumpfunc(dumpdata, type_name); + eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str); + dumpfunc(dumpdata, "\""); + break; - dumpfunc(dumpdata, type_name); - eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str); - dumpfunc(dumpdata, "\""); - break; case EET_T_NULL: - dumpfunc(dumpdata, "null"); - break; + dumpfunc(dumpdata, "null"); + break; + default: - dumpfunc(dumpdata, "???: ???"); - break; + dumpfunc(dumpdata, "???: ???"); + break; } - dumpfunc(dumpdata, ";\n"); + dumpfunc(dumpdata, ";\n"); } static void -eet_node_dump_group_start(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, - int group_type, const char *name) +eet_node_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; + group_type : EET_G_LAST; eet_node_dump_level(level, dumpfunc, dumpdata); dumpfunc(dumpdata, "group \""); eet_node_dump_string_escape(dumpdata, dumpfunc, name); - dumpfunc(dumpdata, "\" "); + dumpfunc(dumpdata, "\" "); dumpfunc(dumpdata, eet_node_dump_g_name[chnk_type - EET_G_UNKNOWN]); - dumpfunc(dumpdata, " {\n"); + dumpfunc(dumpdata, " {\n"); } static void -eet_node_dump_group_end(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata) +eet_node_dump_group_end(int level, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata) { eet_node_dump_level(level, dumpfunc, dumpdata); dumpfunc(dumpdata, "}\n"); } void -eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const char *str), void *dumpdata) +eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata) { Eet_Node *it; - if (!n) return ; + if (!n) + return; switch (n->type) { @@ -518,32 +570,37 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch case EET_G_UNKNOWN: case EET_G_HASH: case EET_G_LIST: - 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 != NULL; it = it->next) - eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata); - - eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata); - break; + 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 != NULL; it = it->next) + eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata); + + eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata); + break; + case EET_T_STRING: case EET_T_INLINED_STRING: case EET_T_CHAR: @@ -556,13 +613,17 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch case EET_T_USHORT: case EET_T_UINT: case EET_T_ULONG_LONG: - eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata); - break; + eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata); + break; } } -void* -eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, void *user_data) +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; @@ -570,39 +631,59 @@ eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, if (!root) { - if (parent) cb->struct_add(parent, name, NULL, user_data); - return NULL; + 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); + 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); - for (it = root->values; it != NULL; it = it->next) - eet_node_walk(me, it->name, it, cb, user_data); + break; - 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); + 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); + 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; - break; case EET_G_LIST: - me = cb->list(root->name, user_data); + 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); - for (it = root->values; it != NULL; it = it->next) - cb->append(me, eet_node_walk(NULL, NULL, it, cb, user_data), user_data); + break; - break; case EET_G_HASH: - if (!parent) return NULL; + if (!parent) + return NULL; + + return cb->hash(parent, root->name, root->key, + eet_node_walk(NULL, + NULL, + root->values, + cb, + user_data), user_data); - 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: @@ -615,11 +696,13 @@ eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, case EET_T_USHORT: case EET_T_UINT: case EET_T_ULONG_LONG: - me = cb->simple(root->type, &root->data, user_data); - break; + me = cb->simple(root->type, &root->data, user_data); + break; } - if (parent) cb->struct_add(parent, name, me, user_data); + if (parent) + cb->struct_add(parent, name, me, user_data); + return me; } @@ -632,9 +715,10 @@ eet_node_init(void) choice = "chained_mempool"; tmp = getenv("EET_MEMPOOL"); if (tmp && tmp[0]) - choice = tmp; + choice = tmp; - _eet_node_mp = eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 1024); + _eet_node_mp = + eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 1024); return _eet_node_mp ? 1 : 0; } |