/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* get_next_line.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/23 20:32:46 by kcolin #+# #+# */ /* Updated: 2024/10/26 10:27:01 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" #include char *ft_strchr(const char *s, int c) { int 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) { int 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(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); return (out); } char *get_next_line(int fd) { static char *buffer = ""; char *read_buffer; int num_bytes_read; size_t length; char *outbuf; read_buffer = malloc(BUFFER_SIZE * sizeof(char)); num_bytes_read = 1; length = 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) * sizeof(char)); if (outbuf == NULL) return (NULL); ft_strlcpy(outbuf, buffer, ft_strchr(buffer, '\n') - buffer + 2); // TODO: shorten current buffer, buffer += ft_strchr(buffer, '\n') - buffer + 1; // DONE: and return. return (outbuf); } num_bytes_read = read(fd, read_buffer + length, BUFFER_SIZE - length - 1); if (num_bytes_read < 0) { free(read_buffer); free(buffer); buffer = NULL; return (NULL); } read_buffer[num_bytes_read] = '\0'; length += num_bytes_read; // DONE: join with big buffer // FIXME: correctly free buffer buffer = ft_strjoin(buffer, read_buffer); } free(read_buffer); return (buffer); }