diff options
Diffstat (limited to '')
-rw-r--r-- | src/ft_history.c | 70 |
1 files changed, 66 insertions, 4 deletions
diff --git a/src/ft_history.c b/src/ft_history.c index 10f683a..7a5c795 100644 --- a/src/ft_history.c +++ b/src/ft_history.c @@ -13,6 +13,7 @@ #include <libft.h> #include <minishell.h> +#include <stddef.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> @@ -20,17 +21,77 @@ #include <sys/types.h> #include <sys/stat.h> +static size_t +ft_count_lines(int fd) +{ + char c; + size_t lines; + + lines = 0; + while (read(fd, &c, 1) > 0) + if (c == '\n') + lines++; + return (lines); +} + +static size_t +ft_last_line_len(int fd, size_t lines_max) +{ + char c; + size_t len; + size_t lines; + + len = 0; + lines = 0; + while (read(fd, &c, 1) > 0) + { + if (c == '\n') + lines++; + if (lines == lines_max - 1) + break ; + } + while (read(fd, &c, 1) > 0) + len++; + return (len); +} + char *ft_get_last_line(void) { - // char *buff; + char *buff; + char c; int fd; - struct stat info; + size_t lines; + size_t i; + i = 0; if ((fd = open("joe-sh_history", O_CREAT | O_RDWR, 0644)) == -1) return (NULL); - fstat(fd, &info); - return ("qweqwe"); + lines = ft_count_lines(fd); + close(fd); + if ((fd = open("joe-sh_history", O_CREAT | O_RDWR, 0644)) == -1) + return (NULL); + if (!(buff = (char*)malloc(ft_last_line_len(fd, lines) * sizeof(char)))) + return (NULL); + close(fd); + if ((fd = open("joe-sh_history", O_CREAT | O_RDWR, 0644)) == -1) + return (NULL); + while (read(fd, &c, 1) > 0) + { + if (c == '\n') + i++; + if (i == lines - 1) + break ; + } + i = 0; + while (read(fd, &c, 1) > 0) + { + buff[i] = c; + i++; + } + buff[i - 1] = '\0'; + close(fd); + return (buff); } int @@ -49,6 +110,7 @@ ft_history(char *arg) return (0); read(fd, buff, info.st_size); ft_putendl_fd(arg, fd); + free(buff); close(fd); return (0); } |