Enlightenment CVS committal

Author  : onefang
Project : e17
Module  : apps/e_utils

Dir     : e17/apps/e_utils/src/bin/e17genmenu/src/bin


Modified Files:
        fdo_menus.c fdo_menus.h main.c menus.c 


Log Message:
Preperation for menu merging.

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/fdo_menus.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- fdo_menus.c 22 Feb 2006 07:49:19 -0000      1.18
+++ fdo_menus.c 22 Feb 2006 13:22:45 -0000      1.19
@@ -20,6 +20,10 @@
 #include "global.h"
 #include "fdo_paths.h"
 #include "parse.h"
+#include "xmlame.h"
+
+extern double convert_time;
+
 
 struct _fdo_menus_expand_apps_data
 {
@@ -30,13 +34,11 @@
 
 struct _fdo_menus_unxml_data
 {
-   Dumb_Tree *menus;
    char *file;
    char *base;
    char *path;
-   Dumb_Tree *stack;
-   Dumb_Tree *merge_stack;
-   int unallocated;
+   Dumb_Tree *stack, *merge_stack;
+   int unallocated, level;
 };
 
 struct _fdo_menus_generate_data
@@ -68,50 +70,109 @@
 static int _fdo_menus_apply_rules(struct _fdo_menus_generate_data 
*generate_data, Dumb_Tree * rule, char *key, Desktop * desktop);
 
 Dumb_Tree *
-fdo_menus_get(char *file, Dumb_Tree * xml)
+fdo_menus_get(char *file, Dumb_Tree *merge_stack, int level)
 {
+   Dumb_Tree * menu_xml;
    struct _fdo_menus_unxml_data data;
+   double begin;
+   int oops = 0;
 
-   data.file = file;
-   data.menus = dumb_tree_new(NULL);
+   /* Preperation. */
+   begin = ecore_time_get();
    data.stack = dumb_tree_new(NULL);
-   if ((data.menus) && (data.stack))
+   data.base = ecore_file_strip_ext(ecore_file_get_file(file));
+   data.path = ecore_file_get_dir(file);
+   if ((level == 0) && (merge_stack == NULL))
+      merge_stack = dumb_tree_new(NULL);
+   menu_xml = xmlame_get(file);
+   if ((data.stack) && (data.base) && (data.path) && (merge_stack) && 
(menu_xml))
      {
-        data.base = ecore_file_strip_ext(ecore_file_get_file(file));
-        data.path = ecore_file_get_dir(file);
-        if ((data.base) && (data.path))
-          {
-             dumb_tree_foreach(xml, 0, _fdo_menus_unxml, &data);
-             dumb_tree_foreach(xml, 0, _fdo_menus_merge, &data);
-             dumb_tree_foreach(xml, 0, _fdo_menus_expand_default_dirs, &data);
-             dumb_tree_dump(xml, 0);
-             printf("\n\n");
-             data.unallocated = FALSE;
-             dumb_tree_foreach(xml, 0, _fdo_menus_generate, &data);
-             data.unallocated = TRUE;
-             dumb_tree_foreach(xml, 0, _fdo_menus_generate, &data);
-             dumb_tree_dump(xml, 0);
-             printf("\n\n");
+        int i;
+
+        data.file = file;
+        data.level = level;
+        data.merge_stack = merge_stack;
+
+        /* Setup the merge stack. */
+        if (merge_stack->size <= level)
+          {
+              while (merge_stack->size < level)
+                 dumb_tree_add(merge_stack, "");
+              dumb_tree_add(merge_stack, file);
           }
-        E_FREE(data.path);
-        E_FREE(data.base);
+        else
+           merge_stack->elements[level].element = file;
+
+        /* Find out if we are looping. */
+        for (i = 0; i < level; i++)
+          {
+             char *text;
+
+             /* I can safely assume that they are all strings. */
+             text = (char *)merge_stack->elements[i].element;
+            if (strcmp(text, file) == 0)
+               {
+                  fprintf(stderr, "Oops, infinite menu merging loop detected 
at %s\n", file);
+                  oops++;
+               }
+         }
+
+        if (oops == 0)
+          {
+             /* Get on with it. */
+              dumb_tree_foreach(menu_xml, 0, _fdo_menus_unxml, &data);
+              dumb_tree_foreach(menu_xml, 0, _fdo_menus_merge, &data);
+              dumb_tree_foreach(menu_xml, 0, _fdo_menus_expand_default_dirs, 
&data);
+
+              if (level == 0)
+               {
+                   convert_time += ecore_time_get() - begin;
+                   dumb_tree_dump(menu_xml, 0);
+                   printf("\n\n");
+                   begin = ecore_time_get();
+               }
+
+              data.unallocated = FALSE;
+              dumb_tree_foreach(menu_xml, 0, _fdo_menus_generate, &data);
+              data.unallocated = TRUE;
+              dumb_tree_foreach(menu_xml, 0, _fdo_menus_generate, &data);
+
+              if (level == 0)
+               {
+                   convert_time += ecore_time_get() - begin;
+                   dumb_tree_dump(menu_xml, 0);
+                   printf("\n\n");
+                   begin = ecore_time_get();
+               }
+          }
      }
    else
+      oops++;
+
+   if (oops)
      {
+        E_FN_DEL(dumb_tree_del, (menu_xml));
+        if (level == 0)
+          {
+              E_FN_DEL(dumb_tree_del, (merge_stack));
+          }
+        E_FREE(data.path);
+        E_FREE(data.base);
         E_FN_DEL(dumb_tree_del, (data.stack));
-        E_FN_DEL(dumb_tree_del, (data.menus));
      }
-   return data.menus;
+
+   if (level == 0)
+      convert_time += ecore_time_get() - begin;
+
+   return menu_xml;
 }
 
 static int
 _fdo_menus_unxml(const void *data, Dumb_Tree * tree, int element, int level)
 {
    struct _fdo_menus_unxml_data *unxml_data;
-   Dumb_Tree *menus;
 
    unxml_data = (struct _fdo_menus_unxml_data *)data;
-   menus = (Dumb_Tree *) unxml_data->menus;
    if (tree->elements[element].type == DUMB_TREE_ELEMENT_TYPE_STRING)
      {
         if (strncmp((char *)tree->elements[element].element, "<!", 2) == 0)
@@ -524,11 +585,10 @@
 _fdo_menus_merge(const void *data, Dumb_Tree * tree, int element, int level)
 {
    struct _fdo_menus_unxml_data *unxml_data;
-   Dumb_Tree *menus, *merge;
+   Dumb_Tree *merge;
    int result = 0;
  
    unxml_data = (struct _fdo_menus_unxml_data *)data;
-   menus = (Dumb_Tree *) unxml_data->menus;
    merge = dumb_tree_new(NULL);
    if (tree->elements[element].type == DUMB_TREE_ELEMENT_TYPE_STRING)
      {
@@ -582,11 +642,10 @@
 _fdo_menus_expand_default_dirs(const void *data, Dumb_Tree * tree, int 
element, int level)
 {
    struct _fdo_menus_unxml_data *unxml_data;
-   Dumb_Tree *menus, *merge;
+   Dumb_Tree *merge;
    int result = 0;
  
    unxml_data = (struct _fdo_menus_unxml_data *)data;
-   menus = (Dumb_Tree *) unxml_data->menus;
    merge = dumb_tree_new(NULL);
    if (tree->elements[element].type == DUMB_TREE_ELEMENT_TYPE_STRING)
      {
@@ -621,10 +680,8 @@
 _fdo_menus_generate(const void *data, Dumb_Tree * tree, int element, int level)
 {
    struct _fdo_menus_unxml_data *unxml_data;
-   Dumb_Tree *menus;
 
    unxml_data = (struct _fdo_menus_unxml_data *)data;
-   menus = (Dumb_Tree *) unxml_data->menus;
    if (tree->elements[element].type == DUMB_TREE_ELEMENT_TYPE_STRING)
      {
         if (strncmp((char *)tree->elements[element].element, "<MENU ", 6) == 0)
@@ -933,12 +990,12 @@
 
 /*
 merge menus
-  expand <KDELegacyDirs> to <LegacyDir>.
+*  expand <KDELegacyDirs> to <LegacyDir>.
   for each <MergeFile>, <MergeDir>, and <LegacyDir> element
     get the root <Menu> elements from that elements file/s.
     remove the <Name> element from those root <Menu> elements.
     replace that element with the child elements of those root <Menu> elements.
-    expand the <DefaultMergeDirs> with the name/s of that elements file/s
+*    expand the <DefaultMergeDirs> with the name/s of that elements file/s
   loop until all <MergeFile>, <MergeDir>, and <LegacyDir> elements are done,
   careful to avoid infinite loops in files that reference each other.
 *  for each <Menu> recursively
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/fdo_menus.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- fdo_menus.h 22 Feb 2006 04:30:53 -0000      1.3
+++ fdo_menus.h 22 Feb 2006 13:22:45 -0000      1.4
@@ -8,7 +8,7 @@
 {
 # endif
 
-   Dumb_Tree *fdo_menus_get(char *file, Dumb_Tree * xml);
+   Dumb_Tree *fdo_menus_get(char *file, Dumb_Tree *merge_stack, int level);
 
 # ifdef __cplusplus
 }
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/main.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- main.c      22 Feb 2006 07:51:47 -0000      1.31
+++ main.c      22 Feb 2006 13:22:45 -0000      1.32
@@ -57,17 +57,12 @@
         char *directory = "Applications.directory";
         char *desktop = "xterm.desktop";
         char *icon = "tux.png";
-        Dumb_Tree *menu_xml = NULL;
+        Dumb_Tree *menus = NULL;
 
         printf("\n\nPath to %s is %s\n", menu, path);
-        menu_xml = xmlame_get(path);;
-        if (menu_xml)
-          {
-             Dumb_Tree *menus = NULL;
 
-             /* convert the xml into menus */
-             menus = fdo_menus_get(path, menu_xml);
-          }
+        /* convert the xml into menus */
+        menus = fdo_menus_get(path, NULL, 0);
         free(path);
 
         /* During the processing of the menu file, you will need to search for 
@@ -216,7 +211,7 @@
    return;
 }
 
-double convert, icon_time = 0.0, cache_time = 0.0;
+double convert_time = 0.0, icon_time = 0.0, cache_time = 0.0;
 int menu_count, item_count, reject_count;
 
 int
@@ -245,7 +240,6 @@
    begin = ecore_time_get();
    /* Start Making Menus */
    make_menus();
-   convert -= begin;
    gen = ecore_time_get() - begin;
 
    /* Sort Menus */
@@ -265,7 +259,7 @@
 
    printf
       ("\nTotal time %3.3f seconds, finding fdo paths %3.3f, converting fdo 
menus %3.3f, generating %d (rejected %d) eaps in %d menus %3.3f, finding icons 
%3.3f, generating eap caches %3.3f.\n",
-       ecore_time_get() - start, paths, convert, item_count, reject_count, 
menu_count, gen - icon_time, icon_time, cache_time);
+       ecore_time_get() - start, paths, convert_time, item_count, 
reject_count, menu_count, gen - icon_time, icon_time, cache_time);
 
    parse_ini_shutdown();
    fdo_paths_shutdown();
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/menus.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- menus.c     22 Feb 2006 04:30:53 -0000      1.13
+++ menus.c     22 Feb 2006 13:22:45 -0000      1.14
@@ -4,9 +4,7 @@
 #include "fdo_paths.h"
 #include "parse.h"
 #include "menus.h"
-#include "xmlame.h"
 
-extern double convert;
 extern int menu_count, item_count;
 
 static int _menu_make_apps(const void *data, Dumb_Tree * tree, int element, 
int level);
@@ -27,21 +25,18 @@
         if (menu_file)
           {
              char *path;
-             Dumb_Tree *menu_xml = NULL;
 
              path = ecore_file_get_dir(menu_file);
-             menu_xml = xmlame_get(menu_file);;
-             if ((menu_xml) && (path))
+             if (path)
                {
                   Dumb_Tree *menus = NULL;
 
                   /* convert the xml into menus */
-                  menus = fdo_menus_get(menu_file, menu_xml);
-                  convert = ecore_time_get();
+                  menus = fdo_menus_get(menu_file, NULL, 0);
                   if (menus)
                     {
                        /* create the .eap and order files from the menu */
-                       dumb_tree_foreach(menu_xml, 0, _menu_make_apps, path);
+                       dumb_tree_foreach(menus, 0, _menu_make_apps, path);
                     }
                }
              E_FREE(path);




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to