/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* get_next_line.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/23 20:32:46 by kcolin #+# #+# */ /* Updated: 2024/10/31 14:11:11 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" #include char *ft_strchr(const char *s, int c) { size_t i; i = 0; while (s[i] != '\0') { if (s[i] == (char)c) return ((char *)s + i); i++; } if ((char)c == '\0') return ((char *)s + i); return (0); } size_t ft_strlen(const char *s) { size_t i; i = 0; while (s[i] != '\0') i++; return (i); } size_t ft_strlcpy(char *dst, const char *src, size_t size) { size_t i; i = 0; while (src[i] != 0) { if (i < size) dst[i] = src[i]; i++; } if (size > 0) { if (size - 1 > i) dst[i] = '\0'; else dst[size - 1] = '\0'; } return (i); } size_t ft_strlcat(char *dst, const char *src, size_t size) { size_t dst_len; size_t src_len; size_t i; dst_len = 0; while (dst[dst_len] != '\0') dst_len++; src_len = 0; while (src[src_len] != '\0') src_len++; if (size <= dst_len) return (size + src_len); i = 0; while (src[i] != '\0' && i < size - dst_len - 1) { dst[dst_len + i] = src[i]; i++; } dst[dst_len + i] = '\0'; return (dst_len + src_len); } char *ft_strjoin_free_s1(char const *s1, char const *s2) { char *out; size_t len; len = ft_strlen(s1) + ft_strlen(s2) + 1; out = malloc(len); if (out == NULL) return (NULL); ft_strlcpy(out, s1, len); ft_strlcat(out, s2, len); free((void *)s1); return (out); } 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 == 0) { outbuf = malloc(1 * sizeof(char)); outbuf[0] = '\0'; } else { index_after_newline = addr_of_newline + 1 - buffer; outlen = ft_strlen(buffer + index_after_newline) + 1; outbuf = malloc(outlen * sizeof(char)); ft_strlcpy(outbuf, buffer + index_after_newline, outlen); } free(buffer); return (outbuf); } char *get_next_line(int fd) { static char *buffer = NULL; char *read_buffer; int num_bytes_read; char *outbuf; read_buffer = malloc((BUFFER_SIZE + 1) * sizeof(char)); num_bytes_read = 1; if (buffer == NULL) buffer = malloc(sizeof(char)); if (buffer == NULL) return (NULL); buffer[0] = '\0'; while (num_bytes_read != 0) { // DONE: if newline found, if (ft_strchr(buffer, '\n')) { // DONE: copy string until newline to new buffer, 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); // DONE: shorten current buffer, // buffer += ft_strchr(buffer, '\n') - buffer + 1; buffer = shorten_buffer(buffer); // DONE: and return. 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'; // DONE: join with big buffer // FIXME: correctly free buffer buffer = ft_strjoin_free_s1(buffer, read_buffer); } free(read_buffer); if (ft_strlen(buffer) == 0) { free(buffer); buffer = NULL; } return (buffer); }