/* ************************************************************************** */ /* LE - / */ /* / */ /* ft_history.c .:: .:/ . .:: */ /* +:+:+ +: +: +:+:+ */ /* By: rbousset +:+ +: +: +:+ */ /* #+# #+ #+ #+# */ /* Created: 2019/10/30 20:36:05 by rbousset #+# ## ## #+# */ /* Updated: 2019/10/30 20:36:07 by rbousset ### #+. /#+ ###.fr */ /* / */ /* / */ /* ************************************************************************** */ #include #include #include #include #include #include #include #include #include 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 *line; char c; int fd; size_t lines; size_t i; if ((fd = open("joe-sh_history", O_CREAT | O_RDWR, 0644)) == -1) return (NULL); i = 0; lines = ft_count_lines(fd); close(fd); if ((fd = open("joe-sh_history", O_CREAT | O_RDWR, 0644)) == -1) return (NULL); if (!(line = (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) { line[i] = c; i++; } line[i - 1] = '\0'; close(fd); return (line); } /* ** Prints user-given line into ** joe-sh_hisotry file */ int ft_history(char *arg) { char *buff; int fd; int ret; struct stat info; if (!*arg) return (0); if ((fd = open("joe-sh_history", O_CREAT | O_RDWR, 0644)) == -1) return (1); fstat(fd, &info); if (!(buff = (char*)malloc(info.st_size * sizeof(char)))) return (0); ret = read(fd, buff, info.st_size); ft_putendl_fd(arg, fd); free(buff); close(fd); return (ret); }