summaryrefslogtreecommitdiffstats
path: root/src/filemanager/dir.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/filemanager/dir.h')
-rw-r--r--src/filemanager/dir.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/filemanager/dir.h b/src/filemanager/dir.h
new file mode 100644
index 0000000..f6a65ee
--- /dev/null
+++ b/src/filemanager/dir.h
@@ -0,0 +1,115 @@
+/** \file dir.h
+ * \brief Header: directory routines
+ */
+
+#ifndef MC__DIR_H
+#define MC__DIR_H
+
+#include <sys/stat.h>
+
+#include "lib/global.h"
+#include "lib/search.h"
+#include "lib/util.h"
+#include "lib/vfs/vfs.h"
+
+/*** typedefs(not structures) and defined constants **********************************************/
+
+#define DIR_LIST_MIN_SIZE 128
+#define DIR_LIST_RESIZE_STEP 128
+
+typedef enum
+{
+ DIR_OPEN = 0,
+ DIR_READ,
+ DIR_CLOSE
+} dir_list_cb_state_t;
+
+/* selection flags */
+typedef enum
+{
+ SELECT_FILES_ONLY = 1 << 0,
+ SELECT_MATCH_CASE = 1 << 1,
+ SELECT_SHELL_PATTERNS = 1 << 2
+} select_flags_t;
+
+#define FILE_FILTER_DEFAULT_FLAGS (SELECT_FILES_ONLY | SELECT_MATCH_CASE | SELECT_SHELL_PATTERNS)
+
+/* dir_list callback */
+typedef void (*dir_list_cb_fn) (dir_list_cb_state_t state, void *data);
+
+/*** enums ***************************************************************************************/
+
+/*** structures declarations (and typedefs of structures)*****************************************/
+
+/**
+ * A structure to represent directory content
+ */
+typedef struct
+{
+ file_entry_t *list; /**< list of file_entry_t objects */
+ int size; /**< number of allocated elements in list (capacity) */
+ int len; /**< number of used elements in list */
+ dir_list_cb_fn callback; /**< callback to visualize of directory read */
+} dir_list;
+
+/**
+ * A structure to represent sort options for directory content
+ */
+typedef struct dir_sort_options_struct
+{
+ gboolean reverse; /**< sort is reverse */
+ gboolean case_sensitive; /**< sort is case sensitive */
+ gboolean exec_first; /**< executables are at top of list */
+} dir_sort_options_t;
+
+/* filter */
+typedef struct
+{
+ char *value;
+ mc_search_t *handler;
+ select_flags_t flags;
+} file_filter_t;
+
+/*** global variables defined in .c file *********************************************************/
+
+/*** declarations of public functions ************************************************************/
+
+gboolean dir_list_grow (dir_list * list, int delta);
+gboolean dir_list_append (dir_list * list, const char *fname, const struct stat *st,
+ gboolean link_to_dir, gboolean stale_link);
+
+gboolean dir_list_load (dir_list * list, const vfs_path_t * vpath, GCompareFunc sort,
+ const dir_sort_options_t * sort_op, const file_filter_t * filter);
+gboolean dir_list_reload (dir_list * list, const vfs_path_t * vpath, GCompareFunc sort,
+ const dir_sort_options_t * sort_op, const file_filter_t * filter);
+void dir_list_sort (dir_list * list, GCompareFunc sort, const dir_sort_options_t * sort_op);
+gboolean dir_list_init (dir_list * list);
+void dir_list_clean (dir_list * list);
+void dir_list_free_list (dir_list * list);
+gboolean handle_path (const char *path, struct stat *buf1, gboolean * link_to_dir,
+ gboolean * stale_link);
+
+/* Sorting functions */
+int unsorted (file_entry_t * a, file_entry_t * b);
+int sort_name (file_entry_t * a, file_entry_t * b);
+int sort_vers (file_entry_t * a, file_entry_t * b);
+int sort_ext (file_entry_t * a, file_entry_t * b);
+int sort_time (file_entry_t * a, file_entry_t * b);
+int sort_atime (file_entry_t * a, file_entry_t * b);
+int sort_ctime (file_entry_t * a, file_entry_t * b);
+int sort_size (file_entry_t * a, file_entry_t * b);
+int sort_inode (file_entry_t * a, file_entry_t * b);
+
+gboolean if_link_is_exe (const vfs_path_t * full_name, const file_entry_t * file);
+
+void file_filter_clear (file_filter_t * filter);
+
+/*** inline functions ****************************************************************************/
+
+static inline gboolean
+link_isdir (const file_entry_t * file)
+{
+ return (gboolean) file->f.link_to_dir;
+}
+
+#endif /* MC__DIR_H */