3 #endif /* ifdef HAVE_CONFIG_H */
10 #endif /* ifdef HAVE_EVIL */
15 #include "Eet_private.h"
17 static Eina_Mempool *_eet_node_mp = NULL;
24 result = eina_mempool_malloc(_eet_node_mp, sizeof (Eet_Node));
28 memset(result, 0, sizeof (Eet_Node));
33 eet_node_free(Eet_Node *node)
35 eina_mempool_free(_eet_node_mp, node);
39 _eet_node_new(const char *name,
49 n->name = eina_stringshare_add(name);
55 _eet_node_append(Eet_Node *n,
61 EINA_LIST_REVERSE_FOREACH(nodes, l, value)
63 value->next = n->values;
68 #define EET_NODE_NEW(Eet_type, Name, Value, Type) \
70 eet_node_ ## Name ## _new(const char *name, Type Value) \
74 n = _eet_node_new(name, Eet_type); \
75 if (!n) { return NULL; } \
77 n->data.value.Value = Value; \
82 #define EET_NODE_STR_NEW(Eet_type, Name, Value, Type) \
84 eet_node_ ## Name ## _new(const char *name, Type Value) \
88 n = _eet_node_new(name, Eet_type); \
89 if (!n) { return NULL; } \
91 n->data.value.Value = eina_stringshare_add(Value); \
96 EET_NODE_NEW(EET_T_CHAR, char, c, char)
97 EET_NODE_NEW(EET_T_SHORT, short, s, short)
98 EET_NODE_NEW(EET_T_INT, int, i, int)
99 EET_NODE_NEW(EET_T_LONG_LONG, long_long, l, long long)
100 EET_NODE_NEW(EET_T_FLOAT, float, f, float)
101 EET_NODE_NEW(EET_T_DOUBLE, double, d, double)
102 EET_NODE_NEW(EET_T_UCHAR, unsigned_char, uc, unsigned char)
103 EET_NODE_NEW(EET_T_USHORT, unsigned_short, us, unsigned short)
104 EET_NODE_NEW(EET_T_UINT, unsigned_int, ui, unsigned int)
105 EET_NODE_NEW(EET_T_ULONG_LONG, unsigned_long_long, ul, unsigned long long)
106 EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *)
107 EET_NODE_STR_NEW(EET_T_INLINED_STRING, inlined_string, str, const char *)
110 eet_node_null_new(const char *name)
114 n = _eet_node_new(name, EET_T_NULL);
118 n->data.value.str = NULL;
124 eet_node_list_new(const char *name,
129 n = _eet_node_new(name, EET_G_LIST);
133 _eet_node_append(n, nodes);
139 eet_node_array_new(const char *name,
145 n = _eet_node_new(name, EET_G_ARRAY);
151 _eet_node_append(n, nodes);
157 eet_node_var_array_new(const char *name,
162 n = _eet_node_new(name, EET_G_VAR_ARRAY);
166 n->count = eina_list_count(nodes);
168 _eet_node_append(n, nodes);
174 eet_node_hash_new(const char *name,
184 n = _eet_node_new(name, EET_G_HASH);
188 n->key = eina_stringshare_add(key);
189 nodes = eina_list_append(NULL, node);
191 _eet_node_append(n, nodes);
197 eet_node_struct_new(const char *name,
202 n = _eet_node_new(name, EET_G_UNKNOWN);
206 _eet_node_append(n, nodes);
212 eet_node_struct_child_new(const char *parent,
217 if (!child) return NULL;
219 if (child->type != EET_G_UNKNOWN)
222 n = _eet_node_new(parent, EET_G_UNKNOWN);
226 _eet_node_append(n, eina_list_prepend(NULL, child));
232 eet_node_children_get(Eet_Node *node)
234 if (!node) return NULL;
239 eet_node_next_get(Eet_Node *node)
241 if (!node) return NULL;
246 eet_node_parent_get(Eet_Node *node)
248 if (!node) return NULL;
253 eet_node_list_append(Eet_Node *parent,
260 if ((!parent) || (!child)) return;
261 tmp = eina_stringshare_add(name);
263 for (nn = parent->values; nn; nn = nn->next)
264 if (nn->name == tmp && nn->type == EET_G_LIST)
272 for (n = nn->values; n->next; n = n->next)
279 eina_stringshare_del(tmp);
284 /* No list found, so create it. */
285 nn = eet_node_list_new(tmp, eina_list_append(NULL, child));
287 /* And add it to the parent. */
288 nn->next = parent->values;
291 eina_stringshare_del(tmp);
295 eet_node_struct_append(Eet_Node *parent,
303 if ((!parent) || (!child)) return;
304 if (parent->type != EET_G_UNKNOWN)
306 ERR("[%s] is not a structure. Will not insert [%s] in it",
313 tmp = eina_stringshare_add(name);
315 for (prev = NULL, nn = parent->values; nn; prev = nn, nn = nn->next)
316 if (nn->name == tmp && nn->type == child->type)
319 prev->next = nn->next;
321 parent->values = nn->next;
337 parent->values = child;
340 eina_stringshare_del(tmp);
344 eet_node_hash_add(Eet_Node *parent,
351 if ((!parent) || (!child)) return;
353 /* No list found, so create it. */
354 nn = eet_node_hash_new(name, key, child);
356 /* And add it to the parent. */
357 nn->next = parent->values;
362 eet_node_type_get(Eet_Node *node)
364 if (!node) return EET_T_UNKNOW;
369 eet_node_value_get(Eet_Node *node)
371 if (!node) return NULL;
376 eet_node_name_get(Eet_Node *node)
378 if (!node) return NULL;
383 eet_node_del(Eet_Node *n)
394 eina_stringshare_del(n->key);
397 case EET_G_VAR_ARRAY:
400 for (nn = n->values; nn; )
409 case EET_T_INLINED_STRING:
410 eina_stringshare_del(n->data.value.str);
416 case EET_T_LONG_LONG:
425 eina_stringshare_del(n->name);
429 static const char *eet_node_dump_g_name[6] = {
438 static const char *eet_node_dump_t_name[14][2] = {
440 { "char: ", "%hhi" },
441 { "short: ", "%hi" },
443 { "long_long: ", "%lli" },
444 { "float: ", "%1.25f" },
445 { "double: ", "%1.25f" },
446 { "uchar: ", "%hhu" },
447 { "ushort: ", "%i" },
449 { "ulong_long: ", "%llu" },
454 eet_node_dump_level(int level,
455 Eet_Dump_Callback dumpfunc,
460 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
464 eet_node_string_escape(const char *str)
470 for (strp = str; *strp; strp++)
474 else if (*strp == '\\')
476 else if (*strp == '\n')
485 for (strp = str, sp = s; *strp; strp++, sp++)
505 eet_node_dump_string_escape(void *dumpdata,
506 Eet_Dump_Callback dumpfunc,
511 s = eet_node_string_escape(str);
515 dumpfunc(dumpdata, s);
520 eet_node_dump_simple_type(Eet_Node *n,
522 Eet_Dump_Callback dumpfunc,
525 const char *type_name = NULL;
528 eet_node_dump_level(level, dumpfunc, dumpdata);
529 dumpfunc(dumpdata, "value \"");
530 eet_node_dump_string_escape(dumpdata, dumpfunc, n->name);
531 dumpfunc(dumpdata, "\" ");
535 #endif /* ifdef EET_T_TYPE */
537 #define EET_T_TYPE(Eet_Type, Type) \
540 dumpfunc(dumpdata, eet_node_dump_t_name[Eet_Type][0]); \
543 eet_node_dump_t_name[Eet_Type][1], \
544 n->data.value.Type); \
545 dumpfunc(dumpdata, tbuf); \
551 EET_T_TYPE(EET_T_CHAR, c);
552 EET_T_TYPE(EET_T_SHORT, s);
553 EET_T_TYPE(EET_T_INT, i);
554 EET_T_TYPE(EET_T_LONG_LONG, l);
555 EET_T_TYPE(EET_T_FLOAT, f);
556 EET_T_TYPE(EET_T_DOUBLE, d);
557 EET_T_TYPE(EET_T_UCHAR, uc);
558 EET_T_TYPE(EET_T_USHORT, us);
559 EET_T_TYPE(EET_T_UINT, ui);
560 EET_T_TYPE(EET_T_ULONG_LONG, ul);
562 case EET_T_INLINED_STRING:
563 type_name = "inlined: \"";
567 type_name = "string: \"";
569 dumpfunc(dumpdata, type_name);
570 eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str);
571 dumpfunc(dumpdata, "\"");
575 dumpfunc(dumpdata, "null");
579 dumpfunc(dumpdata, "???: ???");
583 dumpfunc(dumpdata, ";\n");
587 eet_node_dump_group_start(int level,
588 Eet_Dump_Callback dumpfunc,
595 chnk_type = (group_type >= EET_G_UNKNOWN && group_type <= EET_G_HASH) ?
596 group_type : EET_G_LAST;
598 eet_node_dump_level(level, dumpfunc, dumpdata);
599 dumpfunc(dumpdata, "group \"");
600 eet_node_dump_string_escape(dumpdata, dumpfunc, name);
601 dumpfunc(dumpdata, "\" ");
603 dumpfunc(dumpdata, eet_node_dump_g_name[chnk_type - EET_G_UNKNOWN]);
604 dumpfunc(dumpdata, " {\n");
608 eet_node_dump_group_end(int level,
609 Eet_Dump_Callback dumpfunc,
612 eet_node_dump_level(level, dumpfunc, dumpdata);
613 dumpfunc(dumpdata, "}\n");
617 eet_node_dump(Eet_Node *n,
619 Eet_Dump_Callback dumpfunc,
629 case EET_G_VAR_ARRAY:
634 eet_node_dump_group_start(dumplevel,
640 if (n->type == EET_G_VAR_ARRAY
641 || n->type == EET_G_ARRAY)
645 eet_node_dump_level(dumplevel, dumpfunc, dumpdata);
646 dumpfunc(dumpdata, " count ");
647 eina_convert_itoa(n->count, tbuf);
648 dumpfunc(dumpdata, tbuf);
649 dumpfunc(dumpdata, ";\n");
651 else if (n->type == EET_G_HASH)
653 eet_node_dump_level(dumplevel, dumpfunc, dumpdata);
654 dumpfunc(dumpdata, " key \"");
655 eet_node_dump_string_escape(dumpdata, dumpfunc, n->key);
656 dumpfunc(dumpdata, "\";\n");
659 for (it = n->values; it; it = it->next)
660 eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata);
662 eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata);
666 case EET_T_INLINED_STRING:
670 case EET_T_LONG_LONG:
676 case EET_T_ULONG_LONG:
677 eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata);
683 eet_node_walk(void *parent,
696 cb->struct_add(parent, name, NULL, user_data);
704 me = cb->struct_alloc(root->name, user_data);
706 for (it = root->values; it; it = it->next)
707 eet_node_walk(me, it->name, it, cb, user_data);
711 case EET_G_VAR_ARRAY:
713 me = cb->array(root->type == EET_G_VAR_ARRAY ? EINA_TRUE : EINA_FALSE,
714 root->name, root->count, user_data);
716 for (i = 0, it = root->values; it; it = it->next)
717 cb->insert(me, i++, eet_node_walk(NULL,
721 user_data), user_data);
726 me = cb->list(root->name, user_data);
728 for (it = root->values; it; it = it->next)
729 cb->append(me, eet_node_walk(NULL,
733 user_data), user_data);
741 return cb->hash(parent, root->name, root->key,
746 user_data), user_data);
749 case EET_T_INLINED_STRING:
753 case EET_T_LONG_LONG:
759 case EET_T_ULONG_LONG:
760 me = cb->simple(root->type, &root->data, user_data);
765 cb->struct_add(parent, name, me, user_data);
776 #ifdef EINA_DEFAULT_MEMPOOL
777 choice = "pass_through";
779 choice = "chained_mempool";
781 tmp = getenv("EINA_MEMPOOL");
786 eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 32);
788 return _eet_node_mp ? 1 : 0;
792 eet_node_shutdown(void)
794 eina_mempool_del(_eet_node_mp);