]> Kevux Git Server - fll/commitdiff
Feature: enable custom filter and sort in fl_directory_list()
authorKevin Day <thekevinday@gmail.com>
Mon, 18 Nov 2019 01:25:40 +0000 (19:25 -0600)
committerKevin Day <thekevinday@gmail.com>
Mon, 18 Nov 2019 01:25:40 +0000 (19:25 -0600)
level_1/fl_directory/c/directory.c
level_1/fl_directory/c/directory.h
level_3/firewall/c/firewall.c

index f6d46d8ce9bf05ffbe02b09fd4a5f6f53b38e704..13a9fe7b9026185e6b314261c38b631bc65b35e0 100644 (file)
@@ -5,7 +5,7 @@ extern "C" {
 #endif
 
 #ifndef _di_fl_directory_list_
-  f_return_status fl_directory_list(const f_string directory_path, f_string_dynamics *names) {
+  f_return_status fl_directory_list(const f_string directory_path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), f_string_dynamics *names) {
     #ifndef _di_level_1_parameter_checking_
       if (names == 0) return f_status_set_error(f_invalid_parameter);
     #endif // _di_level_1_parameter_checking_
@@ -16,7 +16,7 @@ extern "C" {
     f_string_length size = 0;
     f_status status = f_none;
 
-    length = scandir(directory_path, &listing, 0, alphasort);
+    length = scandir(directory_path, &listing, filter, sort);
 
     for (; i < length; i++) {
       size = strnlen(listing[i]->d_name, fl_directory_name_max);
index dcc0deb9d970636170b7e24cac005d9472026016..bb73e73996390c0ad2d37cbb109e7af83c73343a 100644 (file)
@@ -37,8 +37,17 @@ extern "C" {
 /**
  * Print the names of each file and/or directory inside the given directory.
  *
+ * Allows specifying a custom filter and custom sort.
+ *
  * @param directory_path
  *   Filesystem path to the directory.
+ * @param filter
+ *   A filter function of the form: int xxx(const struct direct *).
+ *   Set to 0 to not use (NULL).
+ * @param sort
+ *   A sort function of the form: int xxx(const struct direct *, const struct direct *).
+ *   Set to 0 to not use (NULL).
+ *   There are two pre-made libc functions available for this: alphasort() and versionsort().
  * @param names
  *   Will be populated with the names of each file and/or directory inside the names parameter.
  *
@@ -48,9 +57,11 @@ extern "C" {
  *   f_failure (with error bit) if failed to read directory information.
  *   f_invalid_parameter (with error bit) if a parameter is invalid.
  *   f_reallocation_error (with error bit) on memory reallocation error.
+ *
+ * @see scandir()
  */
 #ifndef _di_fl_directory_list_
-  extern f_return_status fl_directory_list(const f_string directory_path, f_string_dynamics *names);
+  extern f_return_status fl_directory_list(const f_string directory_path, int (*filter)(const struct dirent *), int (*sort)(const struct dirent **, const struct dirent **), f_string_dynamics *names);
 #endif // _di_fl_directory_list_
 
 #ifdef __cplusplus
index 6eda8b74f8741ee972317c53ef59f82506bcdb9b..309cfdd26aae877f2fec431dc3164698f0032513 100644 (file)
@@ -316,7 +316,7 @@ extern "C" {
         }
 
         // load all network devices
-        status = fl_directory_list((f_string) network_devices, &data->devices);
+        status = fl_directory_list((f_string) network_devices, 0, alphasort, &data->devices);
 
         if (f_status_is_error(status)) {
           status = f_status_set_fine(status);