edit for 42 and bug fix

This commit is contained in:
Xamora 2025-01-10 15:30:01 +01:00
parent 69aefc764d
commit 9e57c380fd
10 changed files with 71 additions and 50 deletions

View file

@ -3,7 +3,7 @@
-includeinc/main.h -includeinc/main.h
-Wall -Wall
-Wextra -Wextra
-std=c23 -std=c2x
-iquoteinc -iquoteinc
-iquotelib -iquotelib
-g -g

View file

@ -10,12 +10,12 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
typedef struct { typedef struct {
bool l; _Bool l;
bool a; _Bool a;
bool R; _Bool R;
bool r; _Bool r;
bool t; _Bool t;
bool dashdash; _Bool dashdash;
int error[2]; int error[2];
} flags_t; } flags_t;
@ -23,7 +23,7 @@ typedef struct {
DIR *dir; DIR *dir;
char *path; char *path;
char *name; char *name;
bool is_file; _Bool is_file;
struct stat stat; struct stat stat;
struct stat lstat; struct stat lstat;
struct passwd *psswd; struct passwd *psswd;
@ -33,6 +33,9 @@ typedef struct {
extern flags_t flags; extern flags_t flags;
extern struct winsize win; extern struct winsize win;
#define true 1
#define false 0
// Parsing // Parsing
void get_flags(char **argv); void get_flags(char **argv);
void parsing(char **argv, t_list ***files, t_list ***dirs, i32 *max_size, i32 *len, i32 *error); void parsing(char **argv, t_list ***files, t_list ***dirs, i32 *max_size, i32 *len, i32 *error);
@ -51,7 +54,7 @@ void space_between_files(t_list **files, dir_t *file);
void strmode(mode_t mode, char *buf); void strmode(mode_t mode, char *buf);
void delete_directory(void *content); void delete_directory(void *content);
t_list **get_all_in(dir_t *dir); t_list **get_all_in(dir_t *dir);
void add_sort(t_list **head, dir_t *new_dir, bool file_priority); void add_sort(t_list **head, dir_t *new_dir, _Bool file_priority);
// Free // Free
void free_files(t_list **files); void free_files(t_list **files);

View file

@ -5,14 +5,14 @@ static void delete(t_list **deleted, void (*del)(void*));
void ft_lstremove_back(t_list **lst, void (*del)(void*)) void ft_lstremove_back(t_list **lst, void (*del)(void*))
{ {
if (lst == nullptr || del == nullptr) if (lst == NULL || del == NULL)
return; return;
if ((*lst)->next == nullptr) if ((*lst)->next == NULL)
return delete(lst, del); return delete(lst, del);
t_list *cur = *lst; t_list *cur = *lst;
while (cur->next != nullptr && cur->next->next != nullptr) while (cur->next != NULL && cur->next->next != NULL)
cur = cur->next; cur = cur->next;
delete(&(cur->next), del); delete(&(cur->next), del);
@ -21,5 +21,5 @@ void ft_lstremove_back(t_list **lst, void (*del)(void*))
static void delete(t_list **deleted, void (*del)(void*)) { static void delete(t_list **deleted, void (*del)(void*)) {
del(*deleted); del(*deleted);
free(*deleted); free(*deleted);
*deleted = nullptr; *deleted = NULL;
} }

View file

@ -3,7 +3,7 @@
void ft_lstremove_front(t_list **lst, void (*del)(void*)) void ft_lstremove_front(t_list **lst, void (*del)(void*))
{ {
if (lst == nullptr || del == nullptr) if (lst == NULL || del == NULL)
return; return;
t_list *next = (*lst)->next; t_list *next = (*lst)->next;

View file

@ -27,7 +27,9 @@ t_list **
get_all_in(dir_t *dir) { get_all_in(dir_t *dir) {
struct dirent *in_dir; struct dirent *in_dir;
t_list **head = ft_calloc(1, sizeof(t_list*)); t_list **head = ft_calloc(1, sizeof(t_list*));
while ((in_dir = readdir(dir->dir)) != nullptr) { if (!head)
return NULL;
while ((in_dir = readdir(dir->dir)) != NULL) {
if (!flags.a && ft_strncmp(".", in_dir->d_name, 1) == 0) if (!flags.a && ft_strncmp(".", in_dir->d_name, 1) == 0)
continue; continue;
remove_all_end_character(dir->path, '/'); remove_all_end_character(dir->path, '/');
@ -36,9 +38,10 @@ get_all_in(dir_t *dir) {
free(new_path); free(new_path);
if (!new_dir) if (!new_dir)
continue; continue;
new_dir->name = in_dir->d_name; free(new_dir->name);
new_dir->name = ft_strdup(in_dir->d_name);
if (ft_strcmp(new_dir->name, "switchpro_rstick_click_md.png") == 0) if (ft_strcmp(new_dir->name, "\n") == 0)
ft_printf(""); ft_printf("");
add_sort(head, new_dir, false); add_sort(head, new_dir, false);
@ -47,13 +50,13 @@ get_all_in(dir_t *dir) {
} }
static bool compare_name(char *s1, char *s2); static _Bool compare_name(char *s1, char *s2);
static bool compare_time(dir_t *dir1, dir_t *dir2); static _Bool compare_time(dir_t *dir1, dir_t *dir2);
void void
add_sort(t_list **head, dir_t *new_dir, bool file_priority) { add_sort(t_list **head, dir_t *new_dir, _Bool file_priority) {
t_list *cur = *head, *prev = NULL; t_list *cur = *head, *prev = NULL;
for (; cur != nullptr; prev = cur, cur = cur->next) { for (; cur != NULL; prev = cur, cur = cur->next) {
dir_t *cur_dir = ((dir_t *)cur->content); dir_t *cur_dir = ((dir_t *)cur->content);
if (file_priority && !cur_dir->is_file && new_dir->is_file) if (file_priority && !cur_dir->is_file && new_dir->is_file)
break; break;
@ -76,14 +79,14 @@ add_sort(t_list **head, dir_t *new_dir, bool file_priority) {
new->next = cur; new->next = cur;
} }
static bool compare_name(char *s1, char *s2) { static _Bool compare_name(char *s1, char *s2) {
i32 cmp = ft_strcmp(s1, s2); i32 cmp = ft_strcmp(s1, s2);
if ((flags.r && cmp > 0) || (!flags.r && cmp < 0)) if ((flags.r && cmp > 0) || (!flags.r && cmp < 0))
return true; return true;
return false; return false;
} }
static bool compare_time(dir_t *dir1, dir_t *dir2) { static _Bool compare_time(dir_t *dir1, dir_t *dir2) {
time_t dir1_sec = dir1->lstat.st_mtim.tv_sec; time_t dir1_sec = dir1->lstat.st_mtim.tv_sec;
time_t dir2_sec = dir2->lstat.st_mtim.tv_sec; time_t dir2_sec = dir2->lstat.st_mtim.tv_sec;
time_t dir1_nsec = dir1->lstat.st_mtim.tv_nsec; time_t dir1_nsec = dir1->lstat.st_mtim.tv_nsec;

View file

@ -8,7 +8,7 @@ void space_between_files(t_list **files, dir_t *file) {
} }
u32 max = 0, i = 0, index_file = 0; u32 max = 0, i = 0, index_file = 0;
for (t_list *cur = *files; cur != nullptr; cur = cur->next) { for (t_list *cur = *files; cur != NULL; cur = cur->next) {
dir_t *cur_file = (dir_t*)(cur)->content; dir_t *cur_file = (dir_t*)(cur)->content;
max = MAX(ft_strlen(cur_file->name), max); max = MAX(ft_strlen(cur_file->name), max);
if (ft_strcmp(cur_file->name, file->name) == 0) if (ft_strcmp(cur_file->name, file->name) == 0)
@ -16,12 +16,12 @@ void space_between_files(t_list **files, dir_t *file) {
i++; i++;
} }
u32 col = MAX(win.ws_col / max, 1); u32 col = MAX(win.ws_col / max, 1);
u32 cal = index_file % col; u32 line = index_file % col;
if (col >= i && index_file != i - 1) if (col >= i && index_file != i - 1)
ft_printf(" "); ft_printf(" ");
else if (col >= i && index_file == i - 1) else if (col >= i && index_file == i - 1)
ft_printf("\n"); ft_printf("\n");
else if (cal == col - 1 || index_file == i - 1) else if (line == col - 1 || index_file == i - 1)
ft_printf("\n"); ft_printf("\n");
else else
for (i = 0; i < max - ft_strlen(file->name) + 1; i++) for (i = 0; i < max - ft_strlen(file->name) + 1; i++)
@ -41,6 +41,8 @@ display_directory(dir_t *dir) {
} }
else { else {
t_list **files = get_all_in(dir); t_list **files = get_all_in(dir);
if (!files)
return;
display_files(files); display_files(files);
free_files(files); free_files(files);
} }
@ -52,11 +54,11 @@ display_files(t_list **files) {
if (flags.l) if (flags.l)
return display_files_stat(files); return display_files_stat(files);
else { else {
for (t_list *cur = *files; cur != nullptr; cur = cur->next) { for (t_list *cur = *files; cur != NULL; cur = cur->next) {
dir_t *dir = (dir_t*)(cur)->content; dir_t *dir = (dir_t*)(cur)->content;
display_name(dir); display_name(dir);
drawed++; drawed++;
if (cur->next != nullptr) if (cur->next != NULL)
space_between_files(files, dir); space_between_files(files, dir);
} }
if (drawed > 0) if (drawed > 0)
@ -83,12 +85,14 @@ display_recursive(dir_t *dir) {
to_print_return_of_line(); to_print_return_of_line();
ft_printf("%s:\n", dir->path); ft_printf("%s:\n", dir->path);
t_list **files = get_all_in(dir); t_list **files = get_all_in(dir);
if (!files)
return;
display_files(files); display_files(files);
for (t_list *cur = *files; cur != nullptr; cur = cur->next) { for (t_list *cur = *files; cur != NULL; cur = cur->next) {
dir_t *cur_dir = (dir_t*)cur->content; dir_t *cur_dir = (dir_t*)cur->content;
if (!cur_dir->is_file if (!cur_dir->is_file
&& ft_strcmp(".", cur_dir->name) != 0 && ft_strcmp(".", cur_dir->path + ft_strlen(cur_dir->path) - 1) != 0
&& ft_strcmp("..", cur_dir->name) != 0) && ft_strcmp("..", cur_dir->path + ft_strlen(cur_dir->path) - 2) != 0)
display_recursive(cur_dir); display_recursive(cur_dir);
} }
free_files(files); free_files(files);

View file

@ -17,7 +17,7 @@ display_files_stat(t_list **files) {
i32 max_size = ft_get_size(((dir_t*)(*files)->content)->lstat.st_size); i32 max_size = ft_get_size(((dir_t*)(*files)->content)->lstat.st_size);
i32 total = 0; i32 total = 0;
t_list *cur; t_list *cur;
for (cur = *files; cur != nullptr; cur = cur->next) { for (cur = *files; cur != NULL; cur = cur->next) {
dir_t *dir = (dir_t*)(cur)->content; dir_t *dir = (dir_t*)(cur)->content;
max_size = MAX(ft_get_size(dir->lstat.st_size), max_size); max_size = MAX(ft_get_size(dir->lstat.st_size), max_size);
total += dir->lstat.st_blocks; total += dir->lstat.st_blocks;
@ -26,7 +26,7 @@ display_files_stat(t_list **files) {
ft_printf("total %d\n", total / 2); ft_printf("total %d\n", total / 2);
i32 drawed = 0; i32 drawed = 0;
for (cur = *files; cur != nullptr; cur = cur->next) { for (cur = *files; cur != NULL; cur = cur->next) {
dir_t *dir = (dir_t*)(cur)->content; dir_t *dir = (dir_t*)(cur)->content;
display_single_stat(dir, max_size); display_single_stat(dir, max_size);
drawed++; drawed++;

View file

@ -1,10 +1,13 @@
void void
free_files(t_list **files) { free_files(t_list **files) {
for (t_list *cur = *files; cur != nullptr;) { for (t_list *cur = *files; cur != NULL;) {
dir_t *file = (dir_t*)cur->content; dir_t *file = (dir_t*)cur->content;
if (!file->is_file) if (!file->is_file)
closedir(file->dir); closedir(file->dir);
free(file->path); free(file->path);
file->path = NULL;
if (file->name)
free(file->name);
free(file); free(file);
t_list *next = cur->next; t_list *next = cur->next;

View file

@ -4,7 +4,6 @@ struct winsize win;
int int
main(int argc, char **argv) { main(int argc, char **argv) {
if (argc > 1) { if (argc > 1) {
get_flags(argv); get_flags(argv);
if (flags.error[0] != -1) { if (flags.error[0] != -1) {
@ -18,12 +17,22 @@ main(int argc, char **argv) {
errno = 0; errno = 0;
t_list **files = ft_calloc(ft_strslen(argv) + 1, sizeof(t_list*)); t_list **files = ft_calloc(ft_strslen(argv) + 1, sizeof(t_list*));
if (!files)
return 1;
t_list **dirs = ft_calloc(ft_strslen(argv) + 1, sizeof(t_list*)); t_list **dirs = ft_calloc(ft_strslen(argv) + 1, sizeof(t_list*));
if (!dirs) {
free(files);
return 1;
}
i32 max_size = 0, len = 0, error = 0; i32 max_size = 0, len = 0, error = 0;
parsing(argv, &files, &dirs, &max_size, &len, &error); parsing(argv, &files, &dirs, &max_size, &len, &error);
if (len == 0 && error == 0) if (len == 0 && error == 0) {
add_sort(dirs, get_directory_files("."), true); dir_t *default_dir = get_directory_files(".");
if (!default_dir)
return 1;
add_sort(dirs, default_dir, true);
}
i32 left = len; i32 left = len;
if (ft_lstsize(*files) > 0) if (ft_lstsize(*files) > 0)
@ -33,7 +42,7 @@ main(int argc, char **argv) {
if (left != len && left > 0) if (left != len && left > 0)
ft_printf("\n"); ft_printf("\n");
for (t_list *cur = *dirs; cur != nullptr; cur = cur->next) { for (t_list *cur = *dirs; cur != NULL; cur = cur->next) {
dir_t *dir = (dir_t*)cur->content; dir_t *dir = (dir_t*)cur->content;
if (len > 1 && !flags.R) if (len > 1 && !flags.R)
ft_printf("%s:\n", dir->path); ft_printf("%s:\n", dir->path);

View file

@ -1,6 +1,6 @@
void void
get_flags(char **argv) { get_flags(char **argv) {
for (i32 i = 1; argv[i] != nullptr; i++) { for (i32 i = 1; argv[i] != NULL; i++) {
if (ft_strcmp(argv[i], "--") == 0) if (ft_strcmp(argv[i], "--") == 0)
return; return;
if (argv[i][0] == '-') { if (argv[i][0] == '-') {
@ -28,13 +28,13 @@ get_flags(char **argv) {
void void
parsing(char **argv, t_list ***files, t_list ***dirs, i32 *max_size, i32 *len, i32 *error) { parsing(char **argv, t_list ***files, t_list ***dirs, i32 *max_size, i32 *len, i32 *error) {
for (i32 i = 0; argv[i + 1] != nullptr; i++) { for (i32 i = 0; argv[i + 1] != NULL; i++) {
if (ft_strcmp(argv[i + 1], "--") == 0) { if (ft_strcmp(argv[i + 1], "--") == 0 && !flags.dashdash) {
flags.dashdash = true; flags.dashdash = true;
continue; continue;
} }
dir_t *dir = get_directory_files(argv[i + 1]); dir_t *dir = get_directory_files(argv[i + 1]);
if (dir != nullptr) { if (dir != NULL) {
(*len)++; (*len)++;
if (dir->is_file) { if (dir->is_file) {
*max_size = MAX(ft_get_size(dir->lstat.st_size), *max_size); *max_size = MAX(ft_get_size(dir->lstat.st_size), *max_size);
@ -53,20 +53,19 @@ static void*
free_dir_return_null(dir_t *dir) { free_dir_return_null(dir_t *dir) {
free(dir->path); free(dir->path);
free(dir); free(dir);
return nullptr; return NULL;
} }
dir_t * dir_t *
get_directory_files(char *path) { get_directory_files(char *path) {
dir_t *dir = nullptr;
if (!flags.dashdash)
if (path[0] == '-' && ft_strlen(path) != 1) if (path[0] == '-' && ft_strlen(path) != 1)
return nullptr; return NULL;
dir = ft_calloc(1, sizeof(dir_t)); dir_t *dir = ft_calloc(1, sizeof(dir_t));
if (!dir)
return NULL;
dir->path = ft_strdup(path); dir->path = ft_strdup(path);
dir->name = dir->path; dir->name = ft_strdup(path);
stat(path, &dir->stat); stat(path, &dir->stat);
lstat(path, &dir->lstat); lstat(path, &dir->lstat);
dir->psswd = getpwuid(dir->stat.st_uid); dir->psswd = getpwuid(dir->stat.st_uid);
@ -83,7 +82,7 @@ get_directory_files(char *path) {
} }
dir->dir = opendir(path); dir->dir = opendir(path);
if (dir->dir == nullptr) { if (dir->dir == NULL) {
if (errno == EACCES) if (errno == EACCES)
ft_printf_fd(2, "Permission denied\n"); ft_printf_fd(2, "Permission denied\n");
else if (errno == ENOENT) else if (errno == ENOENT)