/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* readall.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: kdx /* always free src */ static char *realloc_buf(char *src, size_t size) { char *cpy; size_t i; cpy = ft_calloc((size + 1) * READALL_BSIZE, sizeof(char)); if (cpy == NULL) return (ft_free(src)); i = -1; while (++i < size * READALL_BSIZE) cpy[i] = src[i]; ft_free(src); return (cpy); } char *readall(int fd) { char *buf; int read_rv; size_t read_cnt; buf = realloc_buf(NULL, 0); if (buf == NULL) return (NULL); read_cnt = 0; read_rv = 1; while (read_rv && buf != NULL) { read_rv = read(fd, buf + read_cnt * READALL_BSIZE, READALL_BSIZE); read_cnt++; if (read_rv < 0) return (ft_free(buf)); else buf = realloc_buf(buf, read_cnt); if (read_rv != READALL_BSIZE) return (buf); } return (buf); }