[geany/geany-plugins] e4f726: utils lib: added new function 'gp_filelist_scan_directory_full()'

LarsDW223 git-noreply at xxxxx
Sun Jan 21 15:21:08 UTC 2018


Branch:      refs/heads/master
Author:      LarsDW223 <lars_paulsen at web.de>
Committer:   LarsDW223 <lars_paulsen at web.de>
Date:        Sun, 21 Jan 2018 15:21:08 UTC
Commit:      e4f726569c6ae09a6fce93c978bc235dfa4b81b7
             https://github.com/geany/geany-plugins/commit/e4f726569c6ae09a6fce93c978bc235dfa4b81b7

Log Message:
-----------
utils lib: added new function 'gp_filelist_scan_directory_full()'

The new function does quite the same like 'gp_filelist_scan_directory()' but also
has an additional parameter 'flags' which allows to control the returned list content
via flags. Only one flag is defined so far:

FILELIST_FLAG_ADD_DIRS: If set, directories will be present as own list entries

If 'flags' is 0 then the result is the same as by calling 'gp_filelist_scan_directory()'.


Modified Paths:
--------------
    utils/src/filelist.c
    utils/src/filelist.h

Modified: utils/src/filelist.c
83 lines changed, 80 insertions(+), 3 deletions(-)
===================================================================
@@ -88,7 +88,7 @@ static gboolean filelist_patterns_match(GSList *patterns, const gchar *str)
 
 
 /* Scan directory searchdir. Input and output parameters come from/go to params. */
-static void filelist_scan_directory_int(const gchar *searchdir, ScanDirParams *params)
+static void filelist_scan_directory_int(const gchar *searchdir, ScanDirParams *params, guint flags)
 {
 	GDir *dir;
 	gchar *locale_path = utils_get_locale_from_utf8(searchdir);
@@ -115,7 +115,9 @@ static void filelist_scan_directory_int(const gchar *searchdir, ScanDirParams *p
 
 		locale_name = g_dir_read_name(dir);
 		if (!locale_name)
+		{
 			break;
+		}
 
 		utf8_name = utils_get_utf8_from_locale(locale_name);
 		locale_filename = g_build_filename(locale_path, locale_name, NULL);
@@ -125,8 +127,12 @@ static void filelist_scan_directory_int(const gchar *searchdir, ScanDirParams *p
 		{
 			if (!filelist_patterns_match(params->ignored_dirs_list, utf8_name))
 			{
-				filelist_scan_directory_int(utf8_filename, params);
+				filelist_scan_directory_int(utf8_filename, params, flags);
 				params->folder_count++;
+				if (flags & FILELIST_FLAG_ADD_DIRS)
+				{
+					params->filelist = g_slist_prepend(params->filelist, g_strdup(utf8_filename));
+				}
 			}
 		}
 		else if (g_file_test(locale_filename, G_FILE_TEST_IS_REGULAR))
@@ -190,7 +196,78 @@ GSList *gp_filelist_scan_directory(guint *files, guint *folders, const gchar *se
 	params.ignored_file_list = filelist_get_precompiled_patterns(ignored_file_patterns);
 
 	params.visited_paths = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-	filelist_scan_directory_int(searchdir, &params);
+	filelist_scan_directory_int(searchdir, &params, 0);
+	g_hash_table_destroy(params.visited_paths);
+
+	g_slist_foreach(params.file_patterns, (GFunc) g_pattern_spec_free, NULL);
+	g_slist_free(params.file_patterns);
+
+	g_slist_foreach(params.ignored_dirs_list, (GFunc) g_pattern_spec_free, NULL);
+	g_slist_free(params.ignored_dirs_list);
+
+	g_slist_foreach(params.ignored_file_list, (GFunc) g_pattern_spec_free, NULL);
+	g_slist_free(params.ignored_file_list);
+
+	if (files != NULL)
+	{
+		*files = params.file_count;
+	}
+	if (folders != NULL)
+	{
+		*folders = params.folder_count;
+	}
+
+	return params.filelist;
+}
+
+
+/** Scan a directory and return a list of files and directories.
+ *
+ * The function scans directory searchdir and returns a list of files.
+ * The list will only include files which match the patterns in file_patterns.
+ * Directories or files matched by ignored_dirs_patterns or ignored_file_patterns
+ * will not be scanned or added to the list.
+ *
+ * If flags is 0 then the result will be the same as for gp_filelist_scan_directory().
+ * 
+ * @param files     Can be optionally specified to return the number of matched/found
+ *                  files in *files.
+ * @param folders   Can be optionally specified to return the number of matched/found
+ *                  folders/sub-directories in *folders.
+ * @param searchdir Directory which shall be scanned
+ * @param file_patterns
+ *                  File patterns for matching files (e.g. "*.c") or NULL
+ *                  for all files.
+ * @param ignored_dirs_patterns
+ *                  Patterns for ignored directories
+ * @param ignored_file_patterns
+ *                  Patterns for ignored files
+ * @param flags     Flags which influence the returned list:
+ *                  - FILELIST_FLAG_ADD_DIRS: if set, directories will be added
+ *                    as own list entries. This also includes empty dirs.
+ * @return GSList of matched files
+ *
+ **/
+GSList *gp_filelist_scan_directory_full(guint *files, guint *folders, const gchar *searchdir, gchar **file_patterns,
+		gchar **ignored_dirs_patterns, gchar **ignored_file_patterns, guint flags)
+{
+	ScanDirParams params = { 0 };
+
+	if (!file_patterns || !file_patterns[0])
+	{
+		const gchar *all_pattern[] = { "*", NULL };
+		params.file_patterns = filelist_get_precompiled_patterns((gchar **)all_pattern);
+	}
+	else
+	{
+		params.file_patterns = filelist_get_precompiled_patterns(file_patterns);
+	}
+
+	params.ignored_dirs_list = filelist_get_precompiled_patterns(ignored_dirs_patterns);
+	params.ignored_file_list = filelist_get_precompiled_patterns(ignored_file_patterns);
+
+	params.visited_paths = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	filelist_scan_directory_int(searchdir, &params, flags);
 	g_hash_table_destroy(params.visited_paths);
 
 	g_slist_foreach(params.file_patterns, (GFunc) g_pattern_spec_free, NULL);


Modified: utils/src/filelist.h
7 lines changed, 7 insertions(+), 0 deletions(-)
===================================================================
@@ -23,8 +23,15 @@
 
 G_BEGIN_DECLS
 
+typedef enum
+{
+	FILELIST_FLAG_ADD_DIRS = 1,
+}FILELIST_FLAG;
+
 GSList *gp_filelist_scan_directory(guint *files, guint *folders, const gchar *searchdir, gchar **file_patterns,
 		gchar **ignored_dirs_patterns, gchar **ignored_file_patterns);
+GSList *gp_filelist_scan_directory_full(guint *files, guint *folders, const gchar *searchdir, gchar **file_patterns,
+		gchar **ignored_dirs_patterns, gchar **ignored_file_patterns, guint flags);
 
 G_END_DECLS
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list