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, Eina_List *nodes)
60 EINA_LIST_REVERSE_FOREACH(nodes, l, value)
62 value->next = n->values;
65 } /* _eet_node_append */
67 #define EET_NODE_NEW(Eet_type, Name, Value, Type)\
69 eet_node_ ## Name ## _new(const char *name, Type Value)\
73 n = _eet_node_new(name, Eet_type);\
74 if (!n) { return NULL; }\
76 n->data.value.Value = Value;\
81 #define EET_NODE_STR_NEW(Eet_type, Name, Value, Type)\
83 eet_node_ ## Name ## _new(const char *name, Type Value)\
87 n = _eet_node_new(name, Eet_type);\
88 if (!n) { return NULL; }\
90 n->data.value.Value = eina_stringshare_add(Value);\
95 EET_NODE_NEW(EET_T_CHAR, char, c, char)
96 EET_NODE_NEW(EET_T_SHORT, short, s, short)
97 EET_NODE_NEW(EET_T_INT, int, i, int)
98 EET_NODE_NEW(EET_T_LONG_LONG, long_long, l, long long)
99 EET_NODE_NEW(EET_T_FLOAT, float, f, float)
100 EET_NODE_NEW(EET_T_DOUBLE, double, d, double)
101 EET_NODE_NEW(EET_T_UCHAR, unsigned_char, uc, unsigned char)
102 EET_NODE_NEW(EET_T_USHORT, unsigned_short, us, unsigned short)
103 EET_NODE_NEW(EET_T_UINT, unsigned_int, ui, unsigned int)
104 EET_NODE_NEW(EET_T_ULONG_LONG, unsigned_long_long, ul, unsigned long long)
105 EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *)
106 EET_NODE_STR_NEW(EET_T_INLINED_STRING, inlined_string, str, const char *)
109 eet_node_null_new(const char *name)
113 n = _eet_node_new(name, EET_T_NULL);
117 n->data.value.str = NULL;
123 eet_node_list_new(const char *name,
128 n = _eet_node_new(name, EET_G_LIST);
132 _eet_node_append(n, nodes);
135 } /* eet_node_list_new */
138 eet_node_array_new(const char *name,
144 n = _eet_node_new(name, EET_G_ARRAY);
150 _eet_node_append(n, nodes);
153 } /* eet_node_array_new */
156 eet_node_var_array_new(const char *name,
161 n = _eet_node_new(name, EET_G_VAR_ARRAY);
165 n->count = eina_list_count(nodes);
167 _eet_node_append(n, nodes);
170 } /* eet_node_var_array_new */
173 eet_node_hash_new(const char *name,
183 n = _eet_node_new(name, EET_G_HASH);
187 n->key = eina_stringshare_add(key);
188 nodes = eina_list_append(NULL, node);
190 _eet_node_append(n, nodes);
193 } /* eet_node_hash_new */
196 eet_node_struct_new(const char *name,
201 n = _eet_node_new(name, EET_G_UNKNOWN);
205 _eet_node_append(n, nodes);
208 } /* eet_node_struct_new */
211 eet_node_struct_child_new(const char *parent,
216 if (child->type != EET_G_UNKNOWN)
219 n = _eet_node_new(parent, EET_G_UNKNOWN);
223 _eet_node_append(n, eina_list_prepend(NULL, child));
226 } /* eet_node_struct_child_new */
229 eet_node_list_append(Eet_Node *parent,
236 tmp = eina_stringshare_add(name);
238 for (nn = parent->values; nn; nn = nn->next)
239 if (nn->name == tmp && nn->type == EET_G_LIST)
247 for (n = nn->values; n->next; n = n->next)
254 eina_stringshare_del(tmp);
259 /* No list found, so create it. */
260 nn = eet_node_list_new(tmp, eina_list_append(NULL, child));
262 /* And add it to the parent. */
263 nn->next = parent->values;
266 eina_stringshare_del(tmp);
267 } /* eet_node_list_append */
270 eet_node_struct_append(Eet_Node *parent,
278 if (parent->type != EET_G_UNKNOWN)
280 ERR("[%s] is not a structure. Will not insert [%s] in it",
287 tmp = eina_stringshare_add(name);
289 for (prev = NULL, nn = parent->values; nn; prev = nn, nn = nn->next)
290 if (nn->name == tmp && nn->type == child->type)
293 prev->next = nn->next;
295 parent->values = nn->next;
311 parent->values = child;
314 eina_stringshare_del(tmp);
315 } /* eet_node_struct_append */
318 eet_node_hash_add(Eet_Node *parent,
325 /* No list found, so create it. */
326 nn = eet_node_hash_new(name, key, child);
328 /* And add it to the parent. */
329 nn->next = parent->values;
331 } /* eet_node_hash_add */
334 eet_node_del(Eet_Node *n)
345 eina_stringshare_del(n->key);
348 case EET_G_VAR_ARRAY:
351 for (nn = n->values; nn; )
360 case EET_T_INLINED_STRING:
361 eina_stringshare_del(n->data.value.str);
367 case EET_T_LONG_LONG:
376 eina_stringshare_del(n->name);
380 static const char *eet_node_dump_g_name[6] = {
389 static const char *eet_node_dump_t_name[14][2] = {
391 { "char: ", "%hhi" },
392 { "short: ", "%hi" },
394 { "long_long: ", "%lli" },
395 { "float: ", "%1.25f" },
396 { "double: ", "%1.25f" },
397 { "uchar: ", "%hhu" },
398 { "ushort: ", "%i" },
400 { "ulong_long: ", "%llu" },
405 eet_node_dump_level(int level,
406 void (*dumpfunc)(void *data, const char *str),
411 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
412 } /* eet_node_dump_level */
415 eet_node_string_escape(const char *str)
421 for (strp = str; *strp; strp++)
425 else if (*strp == '\\')
427 else if (*strp == '\n')
436 for (strp = str, sp = s; *strp; strp++, sp++)
453 } /* eet_node_string_escape */
456 eet_node_dump_string_escape(void *dumpdata,
457 void dumpfunc(void *data, const char *str),
462 s = eet_node_string_escape(str);
466 dumpfunc(dumpdata, s);
468 } /* eet_node_dump_string_escape */
471 eet_node_dump_simple_type(Eet_Node *n, int level,
472 void (*dumpfunc)(void *data, const char *str),
475 const char *type_name = NULL;
478 eet_node_dump_level(level, dumpfunc, dumpdata);
479 dumpfunc(dumpdata, "value \"");
480 eet_node_dump_string_escape(dumpdata, dumpfunc, n->name);
481 dumpfunc(dumpdata, "\" ");
485 #endif /* ifdef EET_T_TYPE */
487 #define EET_T_TYPE(Eet_Type, Type)\
490 dumpfunc(dumpdata, eet_node_dump_t_name[Eet_Type][0]);\
493 eet_node_dump_t_name[Eet_Type][1],\
494 n->data.value.Type);\
495 dumpfunc(dumpdata, tbuf);\
501 EET_T_TYPE(EET_T_CHAR, c);
502 EET_T_TYPE(EET_T_SHORT, s);
503 EET_T_TYPE(EET_T_INT, i);
504 EET_T_TYPE(EET_T_LONG_LONG, l);
505 EET_T_TYPE(EET_T_FLOAT, f);
506 EET_T_TYPE(EET_T_DOUBLE, d);
507 EET_T_TYPE(EET_T_UCHAR, uc);
508 EET_T_TYPE(EET_T_USHORT, us);
509 EET_T_TYPE(EET_T_UINT, ui);
510 EET_T_TYPE(EET_T_ULONG_LONG, ul);
512 case EET_T_INLINED_STRING:
513 type_name = "inlined: \"";
517 type_name = "string: \"";
519 dumpfunc(dumpdata, type_name);
520 eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str);
521 dumpfunc(dumpdata, "\"");
525 dumpfunc(dumpdata, "null");
529 dumpfunc(dumpdata, "???: ???");
533 dumpfunc(dumpdata, ";\n");
534 } /* eet_node_dump_simple_type */
537 eet_node_dump_group_start(int level,
538 void (*dumpfunc)(void *data, const char *str),
545 chnk_type = (group_type >= EET_G_UNKNOWN && group_type <= EET_G_HASH) ?
546 group_type : EET_G_LAST;
548 eet_node_dump_level(level, dumpfunc, dumpdata);
549 dumpfunc(dumpdata, "group \"");
550 eet_node_dump_string_escape(dumpdata, dumpfunc, name);
551 dumpfunc(dumpdata, "\" ");
553 dumpfunc(dumpdata, eet_node_dump_g_name[chnk_type - EET_G_UNKNOWN]);
554 dumpfunc(dumpdata, " {\n");
555 } /* eet_node_dump_group_start */
558 eet_node_dump_group_end(int level,
559 void (*dumpfunc)(void *data, const char *str),
562 eet_node_dump_level(level, dumpfunc, dumpdata);
563 dumpfunc(dumpdata, "}\n");
564 } /* eet_node_dump_group_end */
567 eet_node_dump(Eet_Node *n,
569 void (*dumpfunc)(void *data, const char *str),
579 case EET_G_VAR_ARRAY:
584 eet_node_dump_group_start(dumplevel,
590 if (n->type == EET_G_VAR_ARRAY
591 || n->type == EET_G_ARRAY)
595 eet_node_dump_level(dumplevel, dumpfunc, dumpdata);
596 dumpfunc(dumpdata, " count ");
597 eina_convert_itoa(n->count, tbuf);
598 dumpfunc(dumpdata, tbuf);
599 dumpfunc(dumpdata, ";\n");
601 else if (n->type == EET_G_HASH)
603 eet_node_dump_level(dumplevel, dumpfunc, dumpdata);
604 dumpfunc(dumpdata, " key \"");
605 eet_node_dump_string_escape(dumpdata, dumpfunc, n->key);
606 dumpfunc(dumpdata, "\";\n");
609 for (it = n->values; it != NULL; it = it->next)
610 eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata);
612 eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata);
616 case EET_T_INLINED_STRING:
620 case EET_T_LONG_LONG:
626 case EET_T_ULONG_LONG:
627 eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata);
630 } /* eet_node_dump */
633 eet_node_walk(void *parent,
646 cb->struct_add(parent, name, NULL, user_data);
654 me = cb->struct_alloc(root->name, user_data);
656 for (it = root->values; it != NULL; it = it->next)
657 eet_node_walk(me, it->name, it, cb, user_data);
661 case EET_G_VAR_ARRAY:
663 me = cb->array(root->type == EET_G_VAR_ARRAY ? EINA_TRUE : EINA_FALSE,
664 root->name, root->count, user_data);
666 for (i = 0, it = root->values; it != NULL; it = it->next)
667 cb->insert(me, i++, eet_node_walk(NULL,
671 user_data), user_data);
676 me = cb->list(root->name, user_data);
678 for (it = root->values; it != NULL; it = it->next)
679 cb->append(me, eet_node_walk(NULL,
683 user_data), user_data);
691 return cb->hash(parent, root->name, root->key,
696 user_data), user_data);
699 case EET_T_INLINED_STRING:
703 case EET_T_LONG_LONG:
709 case EET_T_ULONG_LONG:
710 me = cb->simple(root->type, &root->data, user_data);
715 cb->struct_add(parent, name, me, user_data);
718 } /* eet_node_walk */
726 choice = "chained_mempool";
727 tmp = getenv("EET_MEMPOOL");
732 eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 1024);
734 return _eet_node_mp ? 1 : 0;
735 } /* eet_node_init */
738 eet_node_shutdown(void)
740 eina_mempool_del(_eet_node_mp);
742 } /* eet_node_shutdown */