Enlightenment CVS committal Author : onefang Project : e17 Module : apps/e_utils
Dir : e17/apps/e_utils/src/bin/e17genmenu/src/bin Modified Files: dumb_tree.c dumb_tree.h fdo_menus.c main.c Log Message: Come back raster, we love you. Er. Re arranging done. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/dumb_tree.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- dumb_tree.c 22 Feb 2006 04:30:53 -0000 1.2 +++ dumb_tree.c 22 Feb 2006 07:49:19 -0000 1.3 @@ -135,31 +135,34 @@ return tree; } -/* OK, so we need a tree insert after all, and it falls into the dumb category. */ +/* OK, so we need a tree merge after all, and it falls into the dumb category. */ Dumb_Tree * -dumb_tree_insert_tree(Dumb_Tree * tree, int before, Dumb_Tree * element) +dumb_tree_merge(Dumb_Tree * tree, int before, Dumb_Tree * element) { int i, size; size = element->size; - tree->elements = (Dumb_Tree_Element *) realloc(tree->elements, (tree->size + size) * sizeof(Dumb_Tree_Element)); - tree->size += size; - for (i = tree->size - 1; i > before; i--) - { - tree->elements[i].element = tree->elements[i - size].element; - tree->elements[i].type = tree->elements[i - size].type; - } - for (i = 0; i < size; i++) - { - tree->elements[before + i].element = element->elements[i].element; - tree->elements[before + i].type = element->elements[i].type; - } + if (size) + { + tree->elements = (Dumb_Tree_Element *) realloc(tree->elements, (tree->size + size) * sizeof(Dumb_Tree_Element)); + tree->size += size; + for (i = tree->size - 1; i > before; i--) + { + tree->elements[i].element = tree->elements[i - size].element; + tree->elements[i].type = tree->elements[i - size].type; + } + for (i = 0; i < size; i++) + { + tree->elements[before + i].element = element->elements[i].element; + tree->elements[before + i].type = element->elements[i].type; + } + } /* Careful, this might screw up the freeing order if that is important. */ -/* size = element->buffers_size; if (size) { +/* tree->buffers = (char **) realloc(tree->buffers, (tree->buffers_size + size) * sizeof(char *)); tree->buffers_size += size; for (i = 0; i < size; i++) @@ -167,8 +170,8 @@ tree->buffers[tree->buffers_size + i] = element->buffers[i]; element->buffers[i] = NULL; } - } */ + } return tree; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/dumb_tree.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- dumb_tree.h 22 Feb 2006 04:30:53 -0000 1.2 +++ dumb_tree.h 22 Feb 2006 07:49:19 -0000 1.3 @@ -46,7 +46,7 @@ void dumb_tree_track(Dumb_Tree * tree, void *element); Dumb_Tree *dumb_tree_extend(Dumb_Tree * tree, char *element); Dumb_Tree *dumb_tree_insert(Dumb_Tree * tree, int before, void *element, Dumb_Tree_Element_Type type); - Dumb_Tree *dumb_tree_insert_tree(Dumb_Tree * tree, int before, Dumb_Tree * element); + Dumb_Tree *dumb_tree_merge(Dumb_Tree * tree, int before, Dumb_Tree * element); Dumb_Tree *dumb_tree_add_child(Dumb_Tree * tree, Dumb_Tree * element); Dumb_Tree *dumb_tree_add_hash(Dumb_Tree * tree, Ecore_Hash * element); int dumb_tree_exist(Dumb_Tree * tree, char *element); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/fdo_menus.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- fdo_menus.c 22 Feb 2006 04:30:53 -0000 1.17 +++ fdo_menus.c 22 Feb 2006 07:49:19 -0000 1.18 @@ -58,6 +58,10 @@ static void _fdo_menus_add_dirs(Dumb_Tree * tree, Dumb_Tree * paths, char *pre, char *post, char *extra, int element); static int _fdo_menus_expand_apps(struct _fdo_menus_unxml_data *unxml_data, char *app_dir, Ecore_Hash * pool); static int _fdo_menus_check_app(const void *data, char *path); + +static int _fdo_menus_merge(const void *data, Dumb_Tree * tree, int element, int level); +static int _fdo_menus_expand_default_dirs(const void *data, Dumb_Tree * tree, int element, int level); + static int _fdo_menus_generate(const void *data, Dumb_Tree * tree, int element, int level); static void _fdo_menus_inherit_apps(void *value, void *user_data); static void _fdo_menus_select_app(void *value, void *user_data); @@ -78,6 +82,8 @@ 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; @@ -174,29 +180,6 @@ flags[2] = ' '; result = 1; } - else if (strcmp((char *)tree->elements[i].element, "<DefaultAppDirs/") == 0) - { - _fdo_menus_add_dirs(menu, fdo_paths_desktops, "<AppDir", "</AppDir", NULL, i); - result = 1; - } - else if (strcmp((char *)tree->elements[i].element, "<DefaultDirectoryDirs/") == 0) - { - _fdo_menus_add_dirs(menu, fdo_paths_directories, "<DirectoryDir", "</DirectoryDir", NULL, i); - result = 1; - } - else if (strcmp((char *)tree->elements[i].element, "<DefaultMergeDirs/") == 0) - { - if (unxml_data->base) - { - _fdo_menus_add_dirs(menu, fdo_paths_menus, "<MergeDir", "</MergeDir", unxml_data->base, i); - result = 1; - } - } - else if (strcmp((char *)tree->elements[i].element, "<KDELegacyDirs/") == 0) - { - _fdo_menus_add_dirs(menu, fdo_paths_kde_legacy, "<LegacyDir prefix=\"kde-\"", "</LegacyDir", NULL, i); - result = 1; - } else if (strcmp((char *)tree->elements[i].element, "</Menu") == 0) { result = 1; @@ -256,6 +239,7 @@ dumb_tree_track(menu, menu->elements[1].element); result = 1; } + /* FIXME: Move this to later in the sequence. */ else if (strcmp((char *)sub->elements[0].element, "<Directory") == 0) { directory = strdup((char *)sub->elements[1].element); @@ -267,19 +251,6 @@ flags += 7; result = 1; } - else if ((strcmp((char *)sub->elements[0].element, "<Include") == 0) || - (strcmp((char *)sub->elements[0].element, "<Exclude") == 0)) - { - Dumb_Tree *new_sub; - - new_sub = dumb_tree_new(NULL); - if (new_sub) - { - dumb_tree_add_child(rules, new_sub); - _fdo_menus_unxml_rules(new_sub, sub, ((char *)sub->elements[0].element)[1], 'O'); - result = 1; - } - } else if (strcmp((char *)sub->elements[0].element, "<Menu") == 0) { _fdo_menus_unxml(data, sub, 0, level + 1); @@ -296,7 +267,7 @@ } else { - if ((sub->size == 3) && (sub->elements[1].type == DUMB_TREE_ELEMENT_TYPE_STRING)) + if ( (sub->size == 3) && (sub->elements[1].type == DUMB_TREE_ELEMENT_TYPE_STRING) && (((char *)sub->elements[1].element)[0] != '<' ) ) { char temp[MAX_PATH]; @@ -323,85 +294,6 @@ } } - for (i = 4; i < menu->size; i++) - { - int result = 0; - - if (menu->elements[i].type == DUMB_TREE_ELEMENT_TYPE_STRING) - { - char *string; - - string = (char *)menu->elements[i].element; - if (strncmp(string, "<DirectoryDir ", 14) == 0) - { - char merge_path[MAX_PATH]; - Dumb_Tree *merge; - - if (string[14] == '/') - sprintf(merge_path, "%s", &string[14]); - else - sprintf(merge_path, "%s%s", unxml_data->path, &string[14]); - merge = dumb_tree_new(NULL); - if (merge) - { - fdo_paths_recursive_search(merge_path, NULL, _fdo_menus_check_directory, merge); - dumb_tree_insert_tree(menu, i + 1, merge); - } - result = 1; - } - else if (strncmp(string, "<LegacyDir ", 11) == 0) - { - } - else if (strncmp(string, "<MergeDir ", 10) == 0) - { - char merge_path[MAX_PATH]; - Dumb_Tree *merge; - - if (string[10] == '/') - sprintf(merge_path, "%s", &string[10]); - else - sprintf(merge_path, "%s%s", unxml_data->path, &string[10]); - merge = dumb_tree_new(NULL); - if (merge) - { - fdo_paths_recursive_search(merge_path, NULL, _fdo_menus_check_menu, merge); - dumb_tree_insert_tree(menu, i + 1, merge); - } - result = 1; - } - else if (strncmp(string, "<MergeFile ", 8) == 0) - { - } - } - if (result) - { - menu->elements[i].type = DUMB_TREE_ELEMENT_TYPE_NULL; - menu->elements[i].element = NULL; - } - } - - for (i = 4; i < menu->size; i++) - { - int result = 0; - - if (menu->elements[i].type == DUMB_TREE_ELEMENT_TYPE_STRING) - { - char *string; - - string = (char *)menu->elements[i].element; - if (strncmp(string, "<AppDir ", 8) == 0) - { - _fdo_menus_expand_apps(unxml_data, &string[8], pool); - result = 1; - } - } - if (result) - { - menu->elements[i].type = DUMB_TREE_ELEMENT_TYPE_NULL; - menu->elements[i].element = NULL; - } - } - /* Add it if it has not been deleted. */ if (flags[1] != 'D') { @@ -575,7 +467,8 @@ sprintf(t, "%s %s%s-merged/", pre, (char *)paths->elements[i].element, extra); else sprintf(t, "%s %s", pre, (char *)paths->elements[i].element); - dumb_tree_extend(tree, t); + if (tree) + dumb_tree_extend(tree, t); } } @@ -628,6 +521,103 @@ } static int +_fdo_menus_merge(const void *data, Dumb_Tree * tree, int element, int level) +{ + struct _fdo_menus_unxml_data *unxml_data; + Dumb_Tree *menus, *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) + { + char *string; + + string = (char *)tree->elements[element].element; + if (strcmp(string, "<DefaultMergeDirs/") == 0) + { + if (unxml_data->base) + _fdo_menus_add_dirs(merge, fdo_paths_menus, "<MergeDir", "</MergeDir", unxml_data->base, element); + result = 1; + } + else if (strcmp(string, "<KDELegacyDirs/") == 0) + { + _fdo_menus_add_dirs(merge, fdo_paths_kde_legacy, "<LegacyDir prefix=\"kde-\"", "</LegacyDir", NULL, element); + result = 1; + } + else if (strncmp(string, "<MergeDir ", 10) == 0) + { + char merge_path[MAX_PATH]; + + if (string[10] == '/') + sprintf(merge_path, "%s", &string[10]); + else + sprintf(merge_path, "%s%s", unxml_data->path, &string[10]); + fdo_paths_recursive_search(merge_path, NULL, _fdo_menus_check_menu, merge); + result = 1; + } + else if (strncmp(string, "<LegacyDir ", 11) == 0) + { + } + else if (strncmp(string, "<MergeFile ", 8) == 0) + { + } + } + + if (result) + { + if ((merge) && (merge->size)) + dumb_tree_merge(tree, element + 1, merge); + + tree->elements[element].type = DUMB_TREE_ELEMENT_TYPE_NULL; + tree->elements[element].element = NULL; + } + + return 0; +} + + +static int +_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; + 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) + { + char *string; + + string = (char *)tree->elements[element].element; + if (strcmp(string, "<DefaultAppDirs/") == 0) + { + _fdo_menus_add_dirs(merge, fdo_paths_desktops, "<AppDir", "</AppDir", NULL, element); + result = 1; + } + else if (strcmp(string, "<DefaultDirectoryDirs/") == 0) + { + _fdo_menus_add_dirs(merge, fdo_paths_directories, "<DirectoryDir", "</DirectoryDir", NULL, element); + result = 1; + } + } + if (result) + { + if ((merge) && (merge->size)) + dumb_tree_merge(tree, element + 1, merge); + + tree->elements[element].type = DUMB_TREE_ELEMENT_TYPE_NULL; + tree->elements[element].element = NULL; + } + + return 0; +} + + +static int _fdo_menus_generate(const void *data, Dumb_Tree * tree, int element, int level) { struct _fdo_menus_unxml_data *unxml_data; @@ -649,9 +639,75 @@ generate_data.rules = (Dumb_Tree *) tree->elements[element + 3].element; generate_data.apps = (Ecore_Hash *) tree->elements[element + 4].element; - /* Inherit the pools on the first pass. */ + /* generate and inherit the pools on the first pass, and preparse the include/exclude logic. */ if (!generate_data.unallocated) { + int i; + + for (i = element + 5; i < tree->size; i++) + { + int result = 0; + char *string; + + if (tree->elements[i].type == DUMB_TREE_ELEMENT_TYPE_STRING) + { + string = (char *)tree->elements[i].element; + if (strncmp(string, "<AppDir ", 8) == 0) + { + _fdo_menus_expand_apps(unxml_data, &string[8], generate_data.pool); + result = 1; + } + else if (strncmp(string, "<DirectoryDir ", 14) == 0) + { + char merge_path[MAX_PATH]; + Dumb_Tree *merge; + + if (string[14] == '/') + sprintf(merge_path, "%s", &string[14]); + else + sprintf(merge_path, "%s%s", unxml_data->path, &string[14]); + merge = dumb_tree_new(NULL); + if (merge) + { + fdo_paths_recursive_search(merge_path, NULL, _fdo_menus_check_directory, merge); + dumb_tree_merge(tree, i + 1, merge); + } + result = 1; + } + } + else if (tree->elements[i].type == DUMB_TREE_ELEMENT_TYPE_TREE) + { + Dumb_Tree *sub; + + sub = (Dumb_Tree *) tree->elements[i].element; + if ((sub) && (sub->size)) + { + if (sub->elements[0].type == DUMB_TREE_ELEMENT_TYPE_STRING) + { + string = (char *)sub->elements[0].element; + if ((strcmp(string, "<Include") == 0) || (strcmp(string, "<Exclude") == 0)) + { + Dumb_Tree *new_sub; + + new_sub = dumb_tree_new(NULL); + if (new_sub) + { + dumb_tree_add_child(generate_data.rules, new_sub); + _fdo_menus_unxml_rules(new_sub, sub, string[1], 'O'); + } + result = 1; + } + } + } + } + + if (result) + { + tree->elements[i].type = DUMB_TREE_ELEMENT_TYPE_NULL; + tree->elements[i].element = NULL; + } + } + if (unxml_data->stack->size <= level) { while (unxml_data->stack->size < level) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/main.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- main.c 22 Feb 2006 04:30:53 -0000 1.29 +++ main.c 22 Feb 2006 07:49:19 -0000 1.30 @@ -231,7 +231,7 @@ start = ecore_time_get(); /* Parse Arguments */ _e17genmenu_parseargs(argc, argv); -//_e17genmenu_test_fdo_paths(); /* For debugging purposes, makes it easier to gdb this. */ +_e17genmenu_test_fdo_paths(); /* For debugging purposes, makes it easier to gdb this. */ /* Set App Args */ ecore_app_args_set(argc, (const char **)argv); ------------------------------------------------------- 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