* eet: Add an experimentale API for walking Eet_Node.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 21 Jan 2010 12:45:35 +0000 (12:45 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 21 Jan 2010 12:45:35 +0000 (12:45 +0000)
This API should be used to generate native scripting object from
an Eet_Data.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eet@45389 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
src/lib/Eet.h
src/lib/Eet_private.h
src/lib/eet_data.c
src/lib/eet_node.c

index 2175c27..edda385 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 2010-01-17  Cedric BAIL
 
        * Add a mempool for Eet_Node.
+
+2010-01-21  Cedric BAIL
+
+       * Add experimental API to walk Eet_Node tree.
index 9c638f0..ff3d069 100644 (file)
@@ -111,9 +111,40 @@ extern "C" {
    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
      {
@@ -1507,6 +1538,9 @@ eet_dictionary_string_check    * example: values), and @p type is the basic data
    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
index 55c5e04..be7c0eb 100644 (file)
@@ -61,19 +61,7 @@ struct _Eet_Node
    Eet_Node   *values;
    Eet_Node   *next;
    Eet_Node   *parent;
-   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;
-   } data;
+   Eet_Node_Data data;
 };
 
 /*
index bb71ba2..34a3b2b 100644 (file)
@@ -1947,7 +1947,7 @@ _eet_data_dump_encode(int parent_type,
               {
                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:
@@ -1982,7 +1982,7 @@ _eet_data_dump_encode(int parent_type,
               {
                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:
@@ -2022,7 +2022,7 @@ _eet_data_dump_encode(int parent_type,
               {
                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:
@@ -2045,7 +2045,7 @@ _eet_data_dump_encode(int parent_type,
 
 #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); \
@@ -2214,67 +2214,67 @@ _eet_data_dump_parse(Eet_Dictionary *ed,
                                           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
                                             {
index c07ef5f..8b87e4d 100644 (file)
@@ -75,7 +75,7 @@ _eet_node_append(Eet_Node *n, Eina_List *nodes)
      n = _eet_node_new(name, Eet_type);                        \
      if (!n) return NULL;                              \
                                                        \
-     n->data.Value = Value;                            \
+     n->data.value.Value = Value;                              \
                                                        \
      return n;                                         \
   }
@@ -89,7 +89,7 @@ _eet_node_append(Eet_Node *n, Eina_List *nodes)
      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;                                         \
   }
@@ -115,7 +115,7 @@ eet_node_null_new(const char *name)
    n = _eet_node_new(name, EET_T_NULL);
    if (!n) return NULL;
 
-   n->data.str = NULL;
+   n->data.value.str = NULL;
 
    return n;
 }
@@ -328,7 +328,7 @@ eet_node_del(Eet_Node *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:
@@ -442,7 +442,7 @@ eet_node_dump_simple_type(Eet_Node *n, int level,
    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;                                                          \
      }
@@ -465,7 +465,7 @@ eet_node_dump_simple_type(Eet_Node *n, int level,
         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:
@@ -561,6 +561,68 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch
      }
 }
 
+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)
 {