SF.net SVN: geany:[4264] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Sep 29 12:10:18 UTC 2009


Revision: 4264
          http://geany.svn.sourceforge.net/geany/?rev=4264&view=rev
Author:   ntrel
Date:     2009-09-29 12:10:17 +0000 (Tue, 29 Sep 2009)

Log Message:
-----------
Add utils_get_file_list_full() which can optionally sort or include
a full path for each list item.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/symbols.c
    trunk/src/templates.c
    trunk/src/utils.c
    trunk/src/utils.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-09-29 11:39:35 UTC (rev 4263)
+++ trunk/ChangeLog	2009-09-29 12:10:17 UTC (rev 4264)
@@ -4,6 +4,9 @@
    Change Perl tag parser to ctags SVN r601. This removes support for
    buggy local/my/our but it parses constant/format/labels and should
    be less buggy overall (closes #2861232).
+ * src/templates.c, src/utils.c, src/utils.h, src/symbols.c:
+   Add utils_get_file_list_full() which can optionally sort or include
+   a full path for each list item.
 
 
 2009-09-28  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c	2009-09-29 11:39:35 UTC (rev 4263)
+++ trunk/src/symbols.c	2009-09-29 12:10:17 UTC (rev 4264)
@@ -1444,18 +1444,6 @@
 }
 
 
-static void utils_slist_add_path(GSList *list, const gchar *path)
-{
-	GSList *node;
-
-	for (node = list; node != NULL; node = g_slist_next(node))
-	{
-		setptr(node->data,
-			g_build_path(G_DIR_SEPARATOR_S, path, node->data, NULL));
-	}
-}
-
-
 static GHashTable *init_user_tags(void)
 {
 	GSList *file_list = NULL, *list = NULL;
@@ -1468,12 +1456,10 @@
 	{
 		utils_mkdir(dir, FALSE);
 	}
-	file_list = utils_get_file_list(dir, NULL, NULL);
-	utils_slist_add_path(file_list, dir);
+	file_list = utils_get_file_list_full(dir, TRUE, TRUE, NULL);
 
 	dir = utils_build_path(app->datadir, "tags", NULL);
-	list = utils_get_file_list(dir, NULL, NULL);
-	utils_slist_add_path(list, dir);
+	list =  utils_get_file_list_full(dir, TRUE, TRUE, NULL);
 	file_list = g_slist_concat(file_list, list);
 
 	lang_hash = get_tagfile_hash(file_list);

Modified: trunk/src/templates.c
===================================================================
--- trunk/src/templates.c	2009-09-29 11:39:35 UTC (rev 4263)
+++ trunk/src/templates.c	2009-09-29 12:10:17 UTC (rev 4264)
@@ -529,24 +529,15 @@
 {
 	gchar *path = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_TEMPLATES_SUBDIR,
 		"files", NULL);
-	GSList *list = NULL;
-	GDir *dir;
-	const gchar *fname;
+	GSList *list = utils_get_file_list_full(path, FALSE, FALSE, NULL);
 
-	dir = g_dir_open(path, 0, NULL);
-	if (dir)
+	if (!list)
 	{
-		foreach_dir(fname, dir)
-			list = g_slist_append(list, g_strdup(fname));
-		g_dir_close(dir);
-	}
-	if (!dir || !list)
-	{
 		utils_mkdir(path, FALSE);
 		return FALSE;
 	}
 	list = g_slist_sort(list, compare_filenames_by_filetype);
-	g_slist_foreach(list, add_file_item, toolbar_new_file_menu);
+	g_slist_foreach(list, add_file_item, NULL);
 	g_slist_foreach(list, (GFunc) g_free, NULL);
 	g_slist_free(list);
 	g_free(path);
@@ -563,14 +554,14 @@
 	/* we hold our own ref on the menu in case it is not used in the toolbar */
 	g_object_ref(toolbar_new_file_menu);
 
-	create_new_menu_items(toolbar_new_file_menu);
+	create_new_menu_items();
 
 	sep1 = gtk_separator_menu_item_new();
 	gtk_container_add(GTK_CONTAINER(new_with_template_menu), sep1);
 	sep2 = gtk_separator_menu_item_new();
 	gtk_container_add(GTK_CONTAINER(toolbar_new_file_menu), sep2);
 
-	if (add_custom_template_items(toolbar_new_file_menu))
+	if (add_custom_template_items())
 	{
 		gtk_widget_show(sep1);
 		gtk_widget_show(sep2);

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2009-09-29 11:39:35 UTC (rev 4263)
+++ trunk/src/utils.c	2009-09-29 12:10:17 UTC (rev 4264)
@@ -1341,36 +1341,35 @@
 }
 
 
-/**
- * Gets a sorted list of files from the specified directory.
+/*
+ * Gets a list of files from the specified directory.
  * Locale encoding is expected for @a path and used for the file list. The list and the data
  * in the list should be freed after use, e.g.:
  * @code
  * g_slist_foreach(list, (GFunc) g_free, NULL);
  * g_slist_free(list); @endcode
  *
- * @note If you don't want sorted filenames you should use the foreach_dir() macro instead -
- * it's more efficient and perhaps easier to use than freeing the list and its contents.
+ * @note If you don't need a list you should use the foreach_dir() macro instead -
+ * it's more efficient.
  *
  * @param path The path of the directory to scan, in locale encoding.
- * @param length The location to store the number of non- at c NULL data items in the list,
- *               unless @c NULL.
+ * @param full_path Whether to include the full path for each filename in the list. Obviously this
+ * will use more memory.
+ * @param sort Whether to sort alphabetically (UTF-8 safe).
  * @param error The location for storing a possible error, or @c NULL.
  *
- * @return A newly allocated list or @c NULL if no files found. The list and its data should be
- *         freed when no longer needed.
+ * @return A newly allocated list or @c NULL if no files were found. The list and its data should be
+ * freed when no longer needed.
+ * @see utils_get_file_list().
  **/
-GSList *utils_get_file_list(const gchar *path, guint *length, GError **error)
+GSList *utils_get_file_list_full(const gchar *path, gboolean full_path, gboolean sort, GError **error)
 {
 	GSList *list = NULL;
-	guint len = 0;
 	GDir *dir;
 	const gchar *filename;
 
 	if (error)
 		*error = NULL;
-	if (length)
-		*length = 0;
 	g_return_val_if_fail(path != NULL, NULL);
 
 	dir = g_dir_open(path, 0, error);
@@ -1379,15 +1378,40 @@
 
 	foreach_dir(filename, dir)
 	{
-		list = g_slist_append(list, g_strdup(filename));
-		len++;
+		list = g_slist_append(list, full_path ?
+			g_build_path(G_DIR_SEPARATOR_S, path, filename, NULL) : g_strdup(filename));
 	}
 	g_dir_close(dir);
 	/* sorting last is quicker than on insertion */
-	list = g_slist_sort(list, (GCompareFunc) utils_str_casecmp);
+	if (sort)
+		list = g_slist_sort(list, (GCompareFunc) utils_str_casecmp);
+	return list;
+}
 
+
+/**
+ * Gets a sorted list of files from the specified directory.
+ * Locale encoding is expected for @a path and used for the file list. The list and the data
+ * in the list should be freed after use, e.g.:
+ * @code
+ * g_slist_foreach(list, (GFunc) g_free, NULL);
+ * g_slist_free(list); @endcode
+ *
+ * @param path The path of the directory to scan, in locale encoding.
+ * @param length The location to store the number of non- at c NULL data items in the list,
+ *               unless @c NULL.
+ * @param error The location for storing a possible error, or @c NULL.
+ *
+ * @return A newly allocated list or @c NULL if no files were found. The list and its data should be
+ *         freed when no longer needed.
+ * @see utils_get_file_list_full().
+ **/
+GSList *utils_get_file_list(const gchar *path, guint *length, GError **error)
+{
+	GSList *list = utils_get_file_list_full(path, FALSE, TRUE, error);
+
 	if (length)
-		*length = len;
+		*length = g_slist_length(list);
 	return list;
 }
 

Modified: trunk/src/utils.h
===================================================================
--- trunk/src/utils.h	2009-09-29 11:39:35 UTC (rev 4263)
+++ trunk/src/utils.h	2009-09-29 12:10:17 UTC (rev 4264)
@@ -215,4 +215,6 @@
 
 gchar *utils_str_remove_chars(gchar *string, const gchar *chars);
 
+GSList *utils_get_file_list_full(const gchar *path, gboolean full_path, gboolean sort, GError **error);
+
 #endif


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list