GFXprim
2D bitmap graphics library with emphasis on speed and correctness
Loading...
Searching...
No Matches
gp_dir_cache.h
1//SPDX-License-Identifier: LGPL-2.0-or-later
2
3/*
4
5 Copyright (c) 2014-2022 Cyril Hrubis <metan@ucw.cz>
6
7 */
8
9#ifndef GP_DIR_CACHE_H
10#define GP_DIR_CACHE_H
11
12#include <utils/gp_poll.h>
13#include <time.h>
14
15typedef struct gp_dir_entry {
16 size_t size;
17 time_t mtime;
18 unsigned int name_len;
19 int is_dir:1;
20 int filtered:1;
21 char name[];
22} gp_dir_entry;
23
24typedef struct gp_dir_cache {
25 int sort_type;
26 struct gp_balloc_pool *allocator;
27 size_t filtered;
28 size_t size;
29 size_t used;
30 struct gp_dir_entry **entries;
31} gp_dir_cache;
32
40gp_dir_cache *gp_dir_cache_new(const char *path);
41
47void gp_dir_cache_destroy(gp_dir_cache *self);
48
60gp_dir_entry *gp_dir_cache_add_entry(gp_dir_cache *self, size_t size,
61 const char *name, mode_t mode, time_t mtime);
62
71int gp_dir_cache_rem_entry_by_name(gp_dir_cache *self, const char *name);
72
80gp_dir_entry *gp_dir_cache_entry_lookup(gp_dir_cache *self, const char *name);
81
87int gp_dir_cache_entry_name_contains(gp_dir_cache *self, const char *needle);
88
96void gp_dir_cache_free_entries(gp_dir_cache *self);
97
98enum gp_dir_cache_sort_type {
99 GP_DIR_SORT_ASC = 0x00,
100 GP_DIR_SORT_DESC = 0x04,
101 GP_DIR_SORT_BY_NAME = 0x00,
102 GP_DIR_SORT_BY_SIZE = 0x01,
103 GP_DIR_SORT_BY_MTIME = 0x02,
104};
105
106void gp_dir_cache_sort(gp_dir_cache *self, int sort_type);
107
108static inline gp_dir_entry *gp_dir_cache_get(gp_dir_cache *self,
109 unsigned int pos)
110{
111 if (self->used <= pos)
112 return NULL;
113
114 return self->entries[pos];
115}
116
117/*
118 * If element has been set to be filtered it's ignored by functions with _filter suffix.
119 *
120 * @self Directory cache.
121 * @pos Element position
122 * @filter Either 1 == filtered or 0 == not filtered.
123 */
124static inline void gp_dir_cache_set_filter(gp_dir_cache *self, unsigned int pos,
125 int filter)
126{
127 if (self->entries[pos]->filtered == !!filter)
128 return;
129
130 self->entries[pos]->filtered = !!filter;
131 self->filtered += filter ? 1 : -1;
132}
133
134/*
135 * @brief Returns number of entries.
136 *
137 * @return A number of entries.
138 */
139static inline size_t gp_dir_cache_entries(gp_dir_cache *self)
140{
141 return self->used;
142}
143
144/*
145 * @brief Returns number of not-filtered entries.
146 *
147 * @return A number of entries.
148 */
149static inline size_t gp_dir_cache_entries_filter(gp_dir_cache *self)
150{
151 return self->used - self->filtered;
152}
153
154/*
155 * Returns entry on position pos ignoring filtered out elements.
156 *
157 * @self A dir cache.
158 * @pos position of the element
159 * @return A dir cache entry or NULL if position is not occupied.
160 */
161gp_dir_entry *gp_dir_cache_get_filtered(gp_dir_cache *self, unsigned int pos);
162
172int gp_dir_cache_notify(gp_dir_cache *self);
173
180gp_fd *gp_dir_cache_notify_fd(gp_dir_cache *self);
181
189int gp_dir_cache_mkdir(gp_dir_cache *self, const char *dirname);
190
198unsigned int gp_dir_cache_pos_by_name_filtered(gp_dir_cache *self, const char *name);
199
200
201
202enum gp_dir_cache_type {
203 GP_DIR_CACHE_NONE = 0,
204 GP_DIR_CACHE_FILE = 1,
205 GP_DIR_CACHE_DIR = 2,
206};
207
214enum gp_dir_cache_type gp_dir_cache_lookup(gp_dir_cache *self, const char *name);
215
216#endif /* GP_DIR_CACHE_H */
A simple epoll wrapper.
An epoll file descriptor.
Definition gp_poll.h:70