summaryrefslogtreecommitdiff
path: root/include/fstree.h
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-11-01 11:51:49 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-03-30 22:31:30 +0200
commita41a57834fc70541ada5579e2d74114f7113e9bc (patch)
tree0488f919013b472bb25cb678388ee911a380a0f1 /include/fstree.h
parent27dfe8bf61a40e6b1a7f736119bf21037eaea2b9 (diff)
Add sort-file implementation
A `flags` field and `priority` are added to all file information structs. A news fstree function is introduced for parsing a "sort-file". Each line in the file is space separated, and has the following format: priority [flags] filename Priority is a 64 bit number, flags are optional and filename can be put in quotes if it is supposed to start or end with spaces. Single line comments can be used. The flags can be used to set block-processor flags (e.g. don't fragment, or don't compress), as well as instructing the parser to use file globbing to match the filename. After parsing the file, the list of file info structure is sorted according to the priority (default is 0) using a stable sort algorithm. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'include/fstree.h')
-rw-r--r--include/fstree.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/include/fstree.h b/include/fstree.h
index 5bdfc7a..9868e8e 100644
--- a/include/fstree.h
+++ b/include/fstree.h
@@ -15,6 +15,7 @@
#include <stdio.h>
#include "sqfs/predef.h"
+#include "fstream.h"
#include "compat.h"
enum {
@@ -41,6 +42,9 @@ typedef struct file_info_t file_info_t;
typedef struct dir_info_t dir_info_t;
typedef struct fstree_t fstree_t;
+#define container_of(ptr, type, member) \
+ ((type *)((char *)ptr - offsetof(type, member)))
+
/*
Optionally used by fstree_from_dir and fstree_from_subdir to
execute custom actions for each discovered node.
@@ -59,6 +63,11 @@ struct file_info_t {
char *input_file;
sqfs_inode_generic_t *inode;
+
+ /* used by sort file processing */
+ sqfs_s64 priority;
+ int flags;
+ bool already_matched;
};
/* Additional meta data stored in a tree_node_t for directories */
@@ -274,4 +283,6 @@ int fstree_from_subdir(fstree_t *fs, tree_node_t *root,
const char *path, const char *subdir,
scan_node_callback cb, void *user, unsigned int flags);
+int fstree_sort_files(fstree_t *fs, istream_t *sortfile);
+
#endif /* FSTREE_H */