/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* get_next_line.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/23 20:32:46 by kcolin #+# #+# */ /* Updated: 2024/11/01 12:41:32 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" #include char *ft_strchr(const char *s, int c); size_t ft_strlen(const char *s); size_t ft_strlcpy(char *dst, const char *src, size_t size); char *ft_strjoin_free_s1(char const *s1, char const *s2); /* static int num_allocs = 0; static void *xmalloc(size_t size) { if (FAIL_AFTER > 0 && num_allocs++ >= FAIL_AFTER) { return 0; } return malloc(size); } #define malloc(x) xmalloc(x) */ char *shorten_buffer(char *buffer) { char *outbuf; char *addr_of_newline; size_t index_after_newline; size_t outlen; addr_of_newline = ft_strchr(buffer, '\n'); if (addr_of_newline == NULL) { buffer[0] = '\0'; return (buffer); } else { index_after_newline = addr_of_newline + 1 - buffer; outlen = ft_strlen(buffer + index_after_newline) + 1; outbuf = malloc(outlen * sizeof(char)); if (outbuf != NULL) ft_strlcpy(outbuf, buffer + index_after_newline, outlen); } free(buffer); return (outbuf); } /* ** returns 1 on error, 0 on success */ int setup_buffers(char **buffer, char **read_buffer) { if (*buffer == NULL) { *buffer = malloc(1 * sizeof(char)); if (*buffer == NULL) return (1); *buffer[0] = '\0'; } *read_buffer = malloc((BUFFER_SIZE + 1) * sizeof(char)); if (*read_buffer == NULL) { free(*buffer); return (1); } return (0); } char *get_next_line(int fd) { static char *buffer = NULL; char *read_buffer; int num_bytes_read; char *outbuf; if (setup_buffers(&buffer, &read_buffer) != 0) return (NULL); num_bytes_read = 1; while (num_bytes_read != 0) { if (ft_strchr(buffer, '\n')) { outbuf = malloc((ft_strchr(buffer, '\n') - buffer + 2)); if (outbuf == NULL) { free(read_buffer); free(buffer); buffer = NULL; return (NULL); } ft_strlcpy(outbuf, buffer, ft_strchr(buffer, '\n') - buffer + 2); buffer = shorten_buffer(buffer); free(read_buffer); return (outbuf); } num_bytes_read = read(fd, read_buffer, BUFFER_SIZE); if (num_bytes_read < 0) { free(read_buffer); free(buffer); buffer = NULL; return (NULL); } read_buffer[num_bytes_read] = '\0'; buffer = ft_strjoin_free_s1(buffer, read_buffer); if (buffer == NULL) return (NULL); } free(read_buffer); outbuf = buffer; if (ft_strlen(buffer) == 0) { free(buffer); outbuf = NULL; } buffer = NULL; return (outbuf); }