summaryrefslogtreecommitdiff
path: root/apps/filetypes.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/filetypes.c')
-rw-r--r--apps/filetypes.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/apps/filetypes.c b/apps/filetypes.c
index c52c734a1d..942ff329fe 100644
--- a/apps/filetypes.c
+++ b/apps/filetypes.c
@@ -184,6 +184,26 @@ static unsigned char highest_attr = 0;
184static int viewer_count = 0; 184static int viewer_count = 0;
185 185
186static int strdup_handle, strdup_bufsize, strdup_cur_idx; 186static int strdup_handle, strdup_bufsize, strdup_cur_idx;
187static int move_callback(int handle, void* current, void* new)
188{
189 /*could compare to strdup_handle, but ops is only used once */
190 (void)handle;
191 size_t diff = new - current;
192#define FIX_PTR(x) \
193 { if ((void*)x > current && (void*)x < (current+strdup_bufsize)) x+= diff; }
194 for(int i = 0; i < filetype_count; i++)
195 {
196 FIX_PTR(filetypes[i].extension);
197 FIX_PTR(filetypes[i].plugin);
198 }
199 return BUFLIB_CB_OK;
200}
201
202static struct buflib_callbacks ops = {
203 .move_callback = move_callback,
204 .shrink_callback = NULL,
205};
206
187static char *filetypes_strdup(char* string) 207static char *filetypes_strdup(char* string)
188{ 208{
189 char *buffer = core_get_data(strdup_handle) + strdup_cur_idx; 209 char *buffer = core_get_data(strdup_handle) + strdup_cur_idx;
@@ -323,7 +343,7 @@ void filetype_init(void)
323 return; 343 return;
324 344
325 strdup_bufsize = filesize(fd); 345 strdup_bufsize = filesize(fd);
326 strdup_handle = core_alloc("filetypes", strdup_bufsize); 346 strdup_handle = core_alloc_ex("filetypes", strdup_bufsize, &ops);
327 if (strdup_handle <= 0) 347 if (strdup_handle <= 0)
328 return; 348 return;
329 read_builtin_types(); 349 read_builtin_types();