1
0
mirror of https://gittea.dev/nova/th.git synced 2025-10-21 10:20:15 -04:00

slight speed optimization

This commit is contained in:
nova
2025-10-02 20:14:53 +02:00
parent c6763233bf
commit 333d4d1df6

63
dir.c
View File

@@ -34,19 +34,21 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file
unsigned long get_dir_size(char *path){ unsigned long get_dir_size(char *path){
DIR *dir = opendir(path); DIR *dir = opendir(path);
unsigned long entry_count = 0; unsigned long entry_count = 0;
if (dir) { struct dirent *entry;
struct dirent *entry; if (dir && file_modifiers & FILE_MODIFIERS_HIDDEN_FILES) {
while ((entry=readdir(dir))) { while ((entry=readdir(dir))) {
if (entry->d_name[0] != '.' || (file_modifiers & FILE_MODIFIERS_HIDDEN_FILES)) { entry_count++;
}
/* removes files "." and ".." */
entry_count -= 2;
} else if (dir) {
while ((entry=readdir(dir))) {
if (entry->d_name[0] != '.') {
entry_count++; entry_count++;
} }
} }
}
closedir(dir);
if (file_modifiers & FILE_MODIFIERS_HIDDEN_FILES) {
/* removes files "." and ".." */
entry_count -= 2;
} }
closedir(dir);
return entry_count; return entry_count;
} }
@@ -65,24 +67,20 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
} else { } else {
dir_content[i].file_name = malloc(strlen(entry[i]->d_name)+1); dir_content[i].file_name = malloc(strlen(entry[i]->d_name)+1);
strcpy(dir_content[i].file_name, entry[i]->d_name); strcpy(dir_content[i].file_name, entry[i]->d_name);
dir_content[i].file_name[strlen(entry[i]->d_name)] = '\0';
struct stat *file; struct stat *file;
file = malloc(sizeof(struct stat)); file = malloc(sizeof(struct stat));
memset(file, ' ', sizeof(struct stat));
/* using the full path allows using the same function for all windows */ /* using the full path allows using the same function for all windows */
unsigned long path_len = strlen(path);
char *full_path = malloc(strlen(path) + strlen(entry[i]->d_name) + 1 + sizeof("/")); char *full_path = malloc(strlen(path) + strlen(entry[i]->d_name) + 1 + sizeof("/"));
memcpy(full_path, path, strlen(path)); memcpy(full_path, path, strlen(path));
memcpy(full_path + path_len, "/", sizeof("/")); memcpy(full_path + strlen(path) + sizeof("/") - 1, entry[i]->d_name, strlen(entry[i]->d_name) + 1);
memcpy(full_path + path_len + sizeof("/") - 1, entry[i]->d_name, strlen(entry[i]->d_name) + 1); full_path[strlen(path)] = '/';
lstat(full_path, file); lstat(full_path, file);
dir_content[i].file_size = file->st_size; dir_content[i].file_size = file->st_size;
dir_content[i].permissions = 1;
dir_content[i].permissions = file->st_mode; dir_content[i].permissions = file->st_mode;
if (S_ISDIR(file->st_mode)) { if (S_ISDIR(file->st_mode)) {
@@ -102,6 +100,18 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
} else if (file->st_mode & S_IXUSR) { } else if (file->st_mode & S_IXUSR) {
dir_content[i].file_type = FILE_TYPE_EXEC; dir_content[i].file_type = FILE_TYPE_EXEC;
dir_content[i].color_pair = COLOR_EXEC; dir_content[i].color_pair = COLOR_EXEC;
} else if (S_ISREG(file->st_mode)) {
dir_content[i].file_type = FILE_TYPE_REGULAR;
dir_content[i].color_pair = COLOR_REGULAR;
unsigned long j = 0;
char *extension = strrchr(entry[i]->d_name, '.');
if (extension) {
for (j = 0; j < color_count; j++) {
if (!strncmp(colors[j].file_extension, extension, strlen(colors[j].file_extension))) {
dir_content[i].color_pair = colors[j].color_pair;
}
}
}
} else if (S_ISBLK(file->st_mode)) { } else if (S_ISBLK(file->st_mode)) {
dir_content[i].file_type = FILE_TYPE_BLOCK; dir_content[i].file_type = FILE_TYPE_BLOCK;
dir_content[i].color_pair = COLOR_BLOCK; dir_content[i].color_pair = COLOR_BLOCK;
@@ -113,19 +123,6 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
} else if (S_ISSOCK(file->st_mode)) { } else if (S_ISSOCK(file->st_mode)) {
dir_content[i].file_type = FILE_TYPE_SOCK; dir_content[i].file_type = FILE_TYPE_SOCK;
dir_content[i].color_pair = COLOR_SOCK; dir_content[i].color_pair = COLOR_SOCK;
} else if (S_ISREG(file->st_mode)) {
dir_content[i].file_type = FILE_TYPE_REGULAR;
dir_content[i].color_pair = COLOR_REGULAR;
unsigned long j = 0;
char *extension = strrchr(entry[i]->d_name, '.');
if (extension) {
for (j = 0; j < color_count; j++) {
if (!strcmp(colors[j].file_extension, extension)) {
dir_content[i].color_pair = colors[j].color_pair;
}
}
} else {
}
} else { } else {
dir_content[i].file_type = COLOR_REGULAR; dir_content[i].file_type = COLOR_REGULAR;
dir_content[i].color_pair = COLOR_REGULAR; dir_content[i].color_pair = COLOR_REGULAR;
@@ -133,7 +130,7 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
char *extension = strrchr(entry[i]->d_name, '.'); char *extension = strrchr(entry[i]->d_name, '.');
if (extension) { if (extension) {
for (j = 0; j < color_count; j++) { for (j = 0; j < color_count; j++) {
if (!strcmp(colors[j].file_extension, extension)) { if (!strncmp(colors[j].file_extension, extension, strlen(colors[j].file_extension))) {
dir_content[i].color_pair = colors[j].color_pair; dir_content[i].color_pair = colors[j].color_pair;
} }
} }
@@ -204,10 +201,10 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file
* if no extension is found, the name will truncate */ * if no extension is found, the name will truncate */
char *file_name; char *file_name;
unsigned long file_name_width = strlen(dir_content[i].file_name); unsigned long file_name_width = strlen(dir_content[i].file_name);
if ((file_name_width + offset_front + is_selected) > offset_back - 1) { if ((file_name_width + offset_front + is_selected) > line_width - 3) {
char *extension = strrchr(dir_content[i].file_name, '.'); char *extension = strrchr(dir_content[i].file_name, '.');
if (extension) { if (extension) {
int char_offset = (file_name_width + offset_front + is_selected) - (offset_back - 1) ; int char_offset = (file_name_width + offset_front + is_selected) - (line_width - 3) ;
if ((file_name_width - char_offset - strlen(extension) - 1) > 1) { if ((file_name_width - char_offset - strlen(extension) - 1) > 1) {
file_name = malloc(file_name_width - char_offset + 1); file_name = malloc(file_name_width - char_offset + 1);
memcpy(file_name, dir_content[i].file_name, file_name_width - char_offset); memcpy(file_name, dir_content[i].file_name, file_name_width - char_offset);
@@ -221,9 +218,9 @@ void print_dir(WINDOW *win, char print_info, unsigned long *dir_file_count, file
file_name[strlen(extension)] = '\0'; file_name[strlen(extension)] = '\0';
} }
} else { } else {
file_name = malloc(file_name_width+1); file_name = malloc(file_name_width+1);
memcpy(file_name, dir_content[i].file_name, file_name_width); memcpy(file_name, dir_content[i].file_name, file_name_width);
file_name[file_name_width] = '\0'; file_name[file_name_width] = '\0';
} }
} else { } else {