From 1d3b71b00faa8c260f476cf63dedee2338c56ddf Mon Sep 17 00:00:00 2001 From: nova Date: Wed, 4 Feb 2026 21:55:03 +0100 Subject: [PATCH] fix incorrect offset on files with long extensions --- dir.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/dir.c b/dir.c index bc7510e..9977c7b 100644 --- a/dir.c +++ b/dir.c @@ -238,30 +238,42 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file /* shortens the printed file name if it is too long - * example input: aaaaaaaa.txt + * example input: aaaaaaaa.txt * example output: aaa~.txt + * example input: aaaaaaaa.longextension + * example output: ~.longe~ * if no extension is found, the name will truncate */ char *file_name = NULL; - unsigned long printable_size = (offset_back - is_selected - offset_front); - if (strlen(dir_content[i].file_name) > printable_size) { + unsigned long printable_size = offset_back - (is_selected + offset_front); + if (strlen(dir_content[i].file_name) >= printable_size) { char *extension = strrchr(dir_content[i].file_name, '.'); if (extension && extension != dir_content[i].file_name) { - file_name = malloc(printable_size); - printable_size -= strlen(extension); + file_name = malloc(printable_size+1); - memcpy(file_name, dir_content[i].file_name, printable_size); - memcpy(file_name + printable_size-1, extension, strlen(extension)); - file_name[printable_size + strlen(extension)-1] = '\0'; - file_name[printable_size - 2] = '~'; + /*if the extension is bigger than the filename this is false */ + if ((&file_name[printable_size - strlen(extension)] - 2) > file_name) { + memcpy(file_name, dir_content[i].file_name, (printable_size - strlen(extension))); + memcpy(file_name + (printable_size - strlen(extension))-1, extension, strlen(extension)+1); + file_name[printable_size - strlen(extension) - 2] = '~'; + file_name[printable_size] = '\0'; + } else { + memcpy(file_name + 1, dir_content[i].file_name, (printable_size - strlen(extension)) -1); + memcpy(file_name + (printable_size - strlen(extension)), extension, strlen(extension) - 2); + file_name[0] = '~'; + file_name[printable_size-2] = '~'; + file_name[printable_size-1] = '\0'; + } } else { file_name = malloc(printable_size); memcpy(file_name, dir_content[i].file_name, printable_size); file_name[printable_size-2] = '~'; file_name[printable_size-1] = '\0'; + file_name[printable_size] = '\0'; } } else { file_name = malloc(strlen(dir_content[i].file_name)+1); - memcpy(file_name, dir_content[i].file_name, strlen(dir_content[i].file_name)+1); + memcpy(file_name, dir_content[i].file_name, strlen(dir_content[i].file_name)); + file_name[strlen(dir_content[i].file_name)] = '\0'; }